我知道,通常可以欺骗命令行实用程序,这些实用程序希望通过将/dev/stdout作为文件名传递到stdout中。
我想知道是否有可能将一个工具管道变成一个编号的文件描述符,而不是stdout/stderr,就像我可以对stderr而不是stdout执行以下操作一样:
command 2>&1 >/dev/null | grep 'something'为了使我的问题更具体(最小可重现性示例):在这里我需要什么来替换/dev/stdout,以便输出以文件描述符号3而不是stdout结束(我不是问关于任何特定工具的问题,我想知道使用什么字符串来管道到fd 3,因为我可以使用/dev/stdout传输到fd 1。
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 ???我应该在这里用什么代替???
我搜索得相当广泛,但什么也找不到。
发布于 2022-06-28 23:33:30
在许多系统(不是全部!)上,/dev/fd/是一个文件句柄目录。在Linux上,它通常是指向/proc/self/fd的链接,但在NetBSD9 (例如)上,它是一个实际的目录。
所以
% ( cat a > /dev/fd/9) 9>&1 >/dev/null | grep .
foo但是,cp似乎依赖于您使用的shell。
在CentOS7和ksh93..。
% cp a /dev/fd/9 9>&1 >/dev/null | cat
cp: cannot create regular file '/dev/fd/9': No such device or address这是因为/dev/fd/9不是一个常规文件。但有了bash..。
$ cp a /dev/fd/9 9>&1 >/dev/null | cat
foo啊,真灵!
我们可以看到,这并不是保证在所有平台上存在,也不是可移植的,甚至在同一平台上的shell之间也是如此!
发布于 2022-06-28 22:21:07
据我所知,并非所有的系统都是如此。但是,关于Debian,也许所有的Gnu/Linuxes
/dev/stdout是/proc/self/fd/1的一个符号链接。如果我们查看/proc/self/fd/目录,那么我们将找到其他文件描述符。注意,这里只会使用正在使用的文件描述符。这取决于这一过程。
发布于 2022-06-28 22:21:58
试试/proc/self/fd/«number»
通过命名进程ID,您实际上可以以这种方式访问任何进程文件。
这是特定于操作系统的,可能并不是所有的Unixes都存在。
https://unix.stackexchange.com/questions/707914
复制相似问题