我知道人们经常可以欺骗命令行实用程序,这些实用程序期望文件通过/dev/stdout
作为文件名传递到标准输出。
我想知道是否可以将工具管道创建到编号的文件描述符而不是stdout
/ stderr
,就像我可以执行以下操作来管道stderr
而不是stdout
:
command 2>&1 >/dev/null | grep 'something'
为了使我的问题更具体(最小的可重复示例):我需要在/dev/stdout
这里替换什么,以便输出以文件描述符 3 结束,而不是stdout
(我不是问任何特定工具的问题,我想知道什么用于管道传输到 fd 3 的字符串,因为我可以使用管道传输到 fd 1 /dev/stdout
。
cp a /dev/stdout
替换cp
为通常需要文件路径的命令。
行/dev/3
吗?我正在寻找/dev/stdout
fd 3 而不是 fd 1 的类似物。
用另一种方式重新表述这个问题:
file descriptor 1 is to /dev/stdout
what
file descriptor 3 is to ???
我应该在这里使用什么而不是???
我进行了相当广泛的搜索,但找不到任何东西。
在许多系统上(不是全部!),
/dev/fd/
是一个文件句柄目录。在 Linux 上,它通常是指向 的链接/proc/self/fd
,但在 NetBSD9(例如)上,它是一个实际目录。所以
但是,
cp
似乎取决于您使用的外壳。在带有 ksh93 的 CentOS7 上...
那是因为
/dev/fd/9
不是常规文件。但是随着bash
...有效!
我们可以看到,这并不能保证在所有平台上都存在并且不可移植,即使在同一平台上的 shell 之间也是如此!
据我所知,并非在所有系统上。但是,在 Debian 和所有 Gnu/Linux 上
/dev/stdout
是 的符号链接/proc/self/fd/1
。如果我们查看目录/proc/self/fd/
,那么我们将找到其他文件描述符。请注意,这里只有正在使用的文件描述符。这将取决于过程。尝试
/proc/self/fd/«number»
通过命名进程 ID,您实际上可以通过这种方式访问任何进程文件。
这是特定于操作系统的,并且可能不适用于所有 Unix。