Как вывести список дескрипторов открытых файлов (и файлов, на которые они ссылаются) в моей текущей сессии bash


23

Я бегу в интерактивной сессии Bash. Я создал несколько файловых дескрипторов, используя exec, и я хотел бы перечислить текущий статус моей сессии bash.

Есть ли способ вывести список открытых файловых дескрипторов?


1
проверить эту ссылку
Kamaraj

@ Kamaraj спасибо. Таким образом, Bash не имеет встроенного, чтобы сделать это? Мне нужно использовать специфичные для Linux функции?
dangonfast

bashне является частью ядра, поэтому он не может знать, что делают другие процессы, даже те, которые он запустил.
Джули Пеллетье

@JuliePelletier: но дочерние процессы не изменяют файловые дескрипторы родительского процесса, не так ли?
dangonfast

Ответы:


27

Да, это будет список всех открытых файловых дескрипторов:

$ 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

Конечно, как обычно: 0 - это стандартный ввод, 1 - стандартный вывод, а 2 - стандартный вывод.
Четвёртое - это открытый файл (для записи) в этом случае.


Это просто список текущего процесса, а не его детей или родителей.
Джули Пеллетье

@JuliePelletier В заголовке вопроса написано «моя текущая сессия bash». Я правильно понимаю?
Соронтар

@JuliePelletier: почему меня интересуют файловые дескрипторы, используемые детьми или родителем моей текущей сессии bash? Меня интересуют только те файловые дескрипторы, которые используются моей текущей сессией bash.
dangonfast

@delavnog: Хорошо, тогда. Если это отвечает на ваш вопрос, вы должны пометить его как таковой.
Джули Пеллетье

4

Предполагая, что вы хотите перечислить файловые дескрипторы, которые присоединены к любому терминалу, вы можете использовать lsof/ fuserили аналогичные им:

$ 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

Эти инструменты в основном разбираются /proc, поэтому вы можете просто получить к ним доступ, /proc/$$/fd/например:

ls /proc/$$/fd/*

2
Выбор \/pts\/отклоняет открытые файлы, какexec 4>testfile.txt
sorontar

@sorontar Да, как я уже сказал, это только для перечисления тех, которые подключены к любому терминалу.
Heemayl

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.