How*_*hen 8 shell bash io-redirection
我可以同时输出stdout和stderr控制台屏幕和存储他们中的一个上到日志文件?
我写了一个测试shell脚本:
#!/bin/sh
echo OUT! >&1
echo ERR! >&2
Run Code Online (Sandbox Code Playgroud)
我可以通过运行脚本在屏幕上输出它们:
$./test
OUT!
ERR!
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式输出stderr并捕获stdout到日志文件中:
$./test | tee 1>log
ERR!
$cat log
OUT!
Run Code Online (Sandbox Code Playgroud)
我只能通过以下方式输出所有内容stdout并stderro输入日志文件:
$./test 2>&1| tee 1>log
$cat log
OUT!
ERR!
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式输出stdout和stderr并将它们全部捕获到日志文件中:
$./test 2>&1 | tee log
OUT!
ERR!
$cat log
OUT!
ERR!
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式输出两者都可以捕获stdout到日志文件中:
$./test | tee 2>&1 log
ERR!
OUT!
$cat log
OUT!
Run Code Online (Sandbox Code Playgroud)
我的问题是:
stdout并捕获stderr到文件中?(我试过./test|tee 2>log,但不起作用)stderr到文件中?Joh*_*024 12
- 如何只输出 stdout 并将 stderr 捕获到文件中?(我试过 ./test|tee 2>log,但不起作用)
$ ./test 2>log
OUT!
$ cat log
ERR!
Run Code Online (Sandbox Code Playgroud)
- 如何只输出两者并将 stderr 捕获到文件中?
$ ./test 2>&1 >/dev/tty | tee log
OUT!
ERR!
$ cat log
ERR!
Run Code Online (Sandbox Code Playgroud)
如果此表达式是更大管道的一部分,则您可能希望避免使用/dev/tty. 一种方法是交换标准输出和标准错误。要进行此交换,我们需要创建第三个文件句柄,如下所示:
$ exec 3>&1; ./test 2>&1 1>&3 | tee log; exec 3>&-
OUT!
ERR!
$ cat log
ERR!
Run Code Online (Sandbox Code Playgroud)
第一条语句exec 3>&1将文件句柄 3 分配给当前的标准输出(无论是什么)。然后,将./test 2>&1 1>&3 | tee logstderr 传送到tee命令,同时将 stdout 发送到文件句柄 3。 最后,为了良好的内务管理,exec 3>&-关闭文件句柄 3。
关于:
我可以通过以下方式输出 stderr 并将 stdout 捕获到日志文件中:
Run Code Online (Sandbox Code Playgroud)$./test | tee 1>log ERR! $cat log OUT!
这可以简化为:
$ ./test >log
ERR!
$ cat log
OUT!
Run Code Online (Sandbox Code Playgroud)
另外,关于:
我只能通过以下方式将所有 stdout 和 stderro 捕获到日志文件中:
Run Code Online (Sandbox Code Playgroud)$ ./test 2>&1| tee 1>log $ cat log OUT! ERR!
这可以简化为:
$ ./test >log 2>&1
$ cat log
OUT!
ERR!
Run Code Online (Sandbox Code Playgroud)
或者,使用bash,但不是 POSIX shell,可以使用更简单的形式:
$ ./test &>log
$ cat log
OUT!
ERR!
Run Code Online (Sandbox Code Playgroud)
Shell 重定向应该足够了。首先,重定向stderr到一个文件...
$ ./test 2> myfile.txt
Run Code Online (Sandbox Code Playgroud)
在这里,stdout仍然是屏幕,因为它没有被重定向。myfile.txt将包含 ERR。
然后,如果你想输出两个,并且仍然捕获stderr到一个文件中,你可能需要分两步进行一些命令替换......
$ ./test 2> >(tee myfile.txt >&2)
Run Code Online (Sandbox Code Playgroud)
这会将错误流发送到tee进程,该进程将重新打印它们。stdout保持不变。有关更多信息,请查看此堆栈溢出问题。
同样,如果你想stdout进入一个文件,并stderr保持原样......
$ ./test > >(tee myfile.txt)
Run Code Online (Sandbox Code Playgroud)