web-dev-qa-db-fra.com

Comment lister les descripteurs de fichiers ouverts (et les fichiers auxquels ils se réfèrent) dans ma session bash actuelle

Je cours dans une session bash interactive. J'ai créé des descripteurs de fichiers, en utilisant exec, et je voudrais lister quel est l'état actuel de ma session bash.

Existe-t-il un moyen de répertorier les descripteurs de fichiers actuellement ouverts?

29
dangonfast

Oui, cela répertoriera tous les descripteurs de fichiers ouverts:

$ ls -la /proc/$$/fd
total 0
dr-x------ 2 sorontar sorontar  0 Dec 28 00:56 .
dr-xr-xr-x 9 sorontar sorontar  0 Dec 28 00:56 ..
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 0 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 1 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 2 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 255 -> /dev/pts/6
l-wx------ 1 sorontar sorontar 64 Dec 28 00:56 4 -> /home/sorontar/testfile.txt

Bien sûr, comme d'habitude: 0 est stdin, 1 est stdout et 2 est stderr.
Le 4ème est un fichier ouvert (à écrire) dans ce cas.

34
Isaac

En supposant que vous souhaitez répertorier les descripteurs de fichiers attachés à n'importe quel terminal, vous pouvez utiliser lsof/fuser ou similaire comme:

$ lsof -p $$ 2>/dev/null | awk '$NF ~ /\/pts\//'
bash    32406 foobar    0u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    1u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    2u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    3u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar  255u   CHR 136,31      0t0      34 /dev/pts/31

Ces outils analysent essentiellement /proc, vous pouvez donc simplement accéder à /proc/$$/fd/ aussi par exemple:

ls /proc/$$/fd/*
5
heemayl
lsof -a -p $$

Réseau fd uniquement:

lsof -i -a -p $$
3
g10guang