读取“stdout”和“stderr”的值

sta*_*rme 6 linux bash shell sh

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

cat /dev/stderr

cat /dev/stdout 
Run Code Online (Sandbox Code Playgroud)

但是,该命令继续运行。

Tod*_*obs 2

使用 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
Run Code Online (Sandbox Code Playgroud)

作为一个更详细但不那么扭曲的示例,请考虑以下内容:

$ ruby -e 'STDERR.puts "Some error."' 2> error & cat error
[1] 32458
Some error.
[1]+  Done                    ruby -e 'STDERR.puts "Some error."' 2> error
Run Code Online (Sandbox Code Playgroud)

在此示例中,Ruby 使用标准错误将字符串写入我们之前创建的错误FIFO。写入发生在后台,但会阻塞,直到 FIFO 被cat命令清空为止。一旦 FIFO 被清空,后台作业就会完成。

FIFO 只是一种特殊类型的文件,因此您可以在使用完后将其删除rm error