sta*_*rme 6 linux bash shell sh
我正在尝试读取stdout并stderr使用以下命令的值:
cat /dev/stderr
cat /dev/stdout
Run Code Online (Sandbox Code Playgroud)
但是,该命令继续运行。
从技术上讲,/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。