如何在当前bash会话中列出打开的文件描述符(及其引用的文件)


23

我在交互式bash会话中运行。我已经使用exec创建了一些文件描述符,我想列出bash会话的当前状态。

有没有办法列出当前打开的文件描述符?


1
检查此链接
Kamaraj

@Kamaraj谢谢。那么bash没有内置的功能吗?我需要使用特定于linux的功能吗?
dangonfast

bash因为它不是内核的一部分,所以它不知道其他进程在做什么,即使它已经启动了。
Julie Pelletier

@JuliePelletier:但是子进程不会更改父进程的文件描述符,对吗?
dangonfast 2013年

Answers:


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是stdin,1是stdout,2是stderr。
在这种情况下,第4个是打开的文件(要写入)。


那只是列出当前进程,而不是其子进程或父进程。
Julie Pelletier

@JuliePelletier问题标题的确显示“我当前的bash会话”。我理解错了吗?
sorontar '16

@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

这些工具基本上都是parse /proc,因此您也可以访问,/proc/$$/fd/例如:

ls /proc/$$/fd/*

2
选择\/pts\/拒绝打开的文件,例如exec 4>testfile.txt
sorontar '16

@sorontar是的,就像我说的那样,该列表仅用于列出连接到任何终端的内容。
heemayl

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.