Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 'stdout'和'stderr'的读取值`_Linux_Bash_Shell_Sh - Fatal编程技术网

Linux 'stdout'和'stderr'的读取值`

Linux 'stdout'和'stderr'的读取值`,linux,bash,shell,sh,Linux,Bash,Shell,Sh,我正在尝试使用以下命令读取stdout和stderr的值: cat /dev/stderr cat /dev/stdout 但是,该命令仍在运行。改用FIFO 从技术上讲,/dev/stdout和/dev/stderr实际上是文件描述符,而不是fifo或命名管道。在我的系统上,它们实际上只是指向/dev/fd/1和/dev/fd/2的符号链接。这些描述符通常链接到您的TTY或PTY。所以,你不能像你想做的那样真正地从他们身上阅读 您可能需要的是mkfifo实用程序。例如,要写入标准错误,然

我正在尝试使用以下命令读取
stdout
stderr
的值:

cat /dev/stderr

cat /dev/stdout 
但是,该命令仍在运行。

改用FIFO 从技术上讲,/dev/stdout和/dev/stderr实际上是文件描述符,而不是fifo或命名管道。在我的系统上,它们实际上只是指向/dev/fd/1和/dev/fd/2的符号链接。这些描述符通常链接到您的TTY或PTY。所以,你不能像你想做的那样真正地从他们身上阅读

您可能需要的是mkfifo实用程序。例如,要写入标准错误,然后从其他命令或脚本读取,请执行以下操作:

# Create a named pipe.
$ mkfifo error

# See what a named pipe looks like in the filesystem.
$ ls -l error
prw-r--r--  1 user  staff  0 May 13 01:47 error|

# In a subshell: echo to stdout, duplicate stdout to stderr,
# write stderr to the error FIFO. Background to avoid blocking.
# Then read from the FIFO until empty, which ends both tasks.
$ ( echo foo >&2 2> error & ); cat error
foo

作为一个更冗长但较少歪曲的例子,考虑一下:

$ ruby -e 'STDERR.puts "Some error."' 2> error & cat error
[1] 32458
Some error.
[1]+  Done                    ruby -e 'STDERR.puts "Some error."' 2> error
在本例中,Ruby使用标准错误将字符串写入前面创建的错误FIFO。写入在后台进行,但会一直阻塞,直到cat命令清空FIFO。FIFO清空后,后台作业完成


FIFO只是一种特殊类型的文件,所以当您处理完
rm error

时可以删除它。我真的不知道读取
stderr
stdin
的值是什么意思,但我可以告诉您为什么
cat/dev/stderr
会继续运行:它正在等待从fd读取数据

在我可以对其进行测试的系统上,两个输出fd都连接到终端,就像
stdin
is一样,并且从它们读取数据工作正常。在Linux上,我们可以通过以下方式查看:

$ ls -l /proc/self/fd
lrwx------ 1 nobody nogroup 64 May 13 21:47 0 -> /dev/pts/1
lrwx------ 1 nobody nogroup 64 May 13 21:47 1 -> /dev/pts/1
lrwx------ 1 nobody nogroup 64 May 13 21:47 2 -> /dev/pts/1
lr-x------ 1 nobody nogroup 64 May 13 21:47 3 -> /proc/44664/fd
行开始处的权限位显示所有fd的0到2都已打开,以进行读取和写入

从他们身上阅读在实践中也很有效(斜体输入):

$cat/dev/stderr 福 福 $read-u 2;echo“回复:$reply” asdf 答复:asdf
尽管如此,如果我们想在终端上进行交互,甚至在有重定向的情况下,打开
/dev/tty
并从那里读取可能会更好。(例如,
ssh
就是这样询问密码的。)

它是由某个命令生成的吗?或者你想在这里读谁的
stdout
stderr
?说
/dev/stderr
/dev/stderr
像文件是真的吗?有点,你可能想读一下你所说的“
stdout
的值”是什么意思?您希望得到什么样的输出?当您键入一个命令时,例如
echo“hello world”
该命令的结果
hello world
显示在标准输出上。我认为
(echo foo>&2>error&)
的重定向顺序错误。这将把stdout重定向到stderr拥有的任何东西(终端),然后将stderr重定向到管道。由于没有读卡器,因此打开管道时进程仍然会阻塞,但是
cat
不会从管道中获取任何信息,只是启动时会释放
echo
以写入终端。尝试一些
。|cat>/dev/null
。|cat-n
$ cat /dev/stderr foo foo $ read -u 2 ; echo "reply: $REPLY" asdf reply: asdf