如何识别哪些文件描述符与 STDIN、STDOUT 等关联

如何识别哪些文件描述符与 STDIN、STDOUT 等关联

我似乎记得一些命令或环境变量告诉你这一点。例如,我基本上想要在终端上执行的东西,给你

echo $STDIN 
/dev/tty
echo $STDOUT
/dev/tty
fdescribe 0 or fdescribe /dev/stdin
/dev/tty
fdescribe 1 or fdescribe /dev/stdout
/dev/tty

但可以在脚本或子进程中执行

答案1

嗯,根据定义,fd 0 与 stdin 相关联,fd 1 与 stdout 相关联。

如果你想知道什么文件在(类似 Bourne 或类似 csh 的 )shell 中打开这些 fd,您可以执行以下操作:

lsof -ap "$$" -d 0-1

在 Linux 或 Cygwin 上,另请参阅:

realpath /dev/stdin /dev/stdout

尽管输出是套接字或管道,但用处不大。

再次在 Linux 上,添加-Etolsof可以为某些类型的文件(例如管道、伪 tty 或某些套接字)提供更多信息,以了解另一端的内容(如果有)。

最新版本util-linux还有一个lsfd实用程序(特定于 Linux),可以为您提供一些与以下内容相同的信息lsof

lsfd -p "$$" -Q '(fd == 0) or (fd == 1)'

或者

lsfd -p "$$" -Q 'assoc =~ "^[01]$"'

¹ 在类似 rc 的 shell 中,使用$pid代替$$fish$fish_pid

相关内容