Как вывести список дескрипторов открытых файлов (и файлов, на которые они ссылаются) в моей текущей сессии 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.