首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件描述符3-255是否等同于/dev/stdout?

文件描述符3-255是否等同于/dev/stdout?
EN

Unix & Linux用户
提问于 2022-06-28 22:06:11
回答 3查看 382关注 0票数 1

我知道,通常可以欺骗命令行实用程序,这些实用程序希望通过将/dev/stdout作为文件名传递到stdout中。

我想知道是否有可能将一个工具管道变成一个编号的文件描述符,而不是stdout/stderr,就像我可以对stderr而不是stdout执行以下操作一样:

代码语言:javascript
复制
command 2>&1 >/dev/null | grep 'something'

为了使我的问题更具体(最小可重现性示例):在这里我需要什么来替换/dev/stdout,以便输出以文件描述符号3而不是stdout结束(我不是问关于任何特定工具的问题,我想知道使用什么字符串来管道到fd 3,因为我可以使用/dev/stdout传输到fd 1。

代码语言:javascript
复制
cp a /dev/stdout

用通常需要文件路径的命令替换cp

/dev/3能工作吗?我在寻找/dev/stdout的类似物,但fd 3而不是fd 1。

用另一种方式重新表述这个问题:

代码语言:javascript
复制
file descriptor 1 is to /dev/stdout 
what 
file descriptor 3 is to ???

我应该在这里用什么代替???

我搜索得相当广泛,但什么也找不到。

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2022-06-28 23:33:30

在许多系统(不是全部!)上,/dev/fd/是一个文件句柄目录。在Linux上,它通常是指向/proc/self/fd的链接,但在NetBSD9 (例如)上,它是一个实际的目录。

所以

代码语言:javascript
复制
% ( cat a > /dev/fd/9) 9>&1 >/dev/null | grep .
foo

但是,cp似乎依赖于您使用的shell。

在CentOS7和ksh93..。

代码语言:javascript
复制
% 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..。

代码语言:javascript
复制
$ cp a /dev/fd/9 9>&1 >/dev/null | cat
foo

啊,真灵!

我们可以看到,这并不是保证在所有平台上存在,也不是可移植的,甚至在同一平台上的shell之间也是如此!

票数 3
EN

Unix & Linux用户

发布于 2022-06-28 22:21:07

据我所知,并非所有的系统都是如此。但是,关于Debian,也许所有的Gnu/Linuxes

/dev/stdout/proc/self/fd/1的一个符号链接。如果我们查看/proc/self/fd/目录,那么我们将找到其他文件描述符。注意,这里只会使用正在使用的文件描述符。这取决于这一过程。

票数 1
EN

Unix & Linux用户

发布于 2022-06-28 22:21:58

试试/proc/self/fd/«number»

通过命名进程ID,您实际上可以以这种方式访问任何进程文件。

这是特定于操作系统的,可能并不是所有的Unixes都存在。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/707914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档