简述bash中,需要将脚本demo.sh的标准输出和标准错误输出重定向至文件demo.log,以下哪些用法是正确的 ?
参考回答
在 Bash 中,标准输出(stdout)和标准错误输出(stderr)可以通过重定向将内容写入文件。要将 demo.sh
脚本的标准输出和标准错误输出都重定向到 demo.log
文件,可以使用以下正确的用法:
./demo.sh > demo.log 2>&1
或者
./demo.sh &> demo.log
> demo.log
: 将标准输出(stdout)重定向到demo.log
文件。2>&1
: 将标准错误输出(stderr)重定向到标准输出(stdout),这样两者都会写入demo.log
文件。&>
: 这是 Bash 中的简写,表示将标准输出和标准错误输出都重定向到同一个文件。
详细讲解与拓展
> demo.log 2>&1
:> demo.log
:将标准输出(stdout)重定向到demo.log
文件中。2>&1
:将标准错误(stderr,文件描述符 2)重定向到标准输出(stdout,文件描述符 1),从而确保标准错误也会写入到demo.log
文件中。
这种用法是常见的传统方法,它是基于文件描述符的概念:
1
是标准输出,2
是标准错误。2>&1
通过将标准错误指向标准输出,实际上是将两个输出都重定向到相同的目标文件。
&> demo.log
:&>
是 Bash 中的简写形式,它表示同时将标准输出和标准错误输出都重定向到同一个文件。这样写法更加简洁,而且仅适用于 Bash。- 该命令和前面的
> demo.log 2>&1
等价,作用是相同的,但更加简洁。
不正确的用法:
./demo.sh > demo.log 1> demo.log
:> demo.log
已经将标准输出重定向到demo.log
,再用1> demo.log
也是多余的,因为标准输出默认是文件描述符1
,且已经重定向到demo.log
。
./demo.sh > demo.log 2> demo.log
:- 这种用法将标准输出和标准错误分别重定向到同一个文件
demo.log
。这样会使标准输出覆盖标准错误,因为两者都写入同一个文件,导致标准错误内容被覆盖掉标准输出内容,结果不是我们希望的。
- 这种用法将标准输出和标准错误分别重定向到同一个文件
总结
将脚本 demo.sh
的标准输出和标准错误输出重定向到文件 demo.log
,可以使用 ./demo.sh > demo.log 2>&1
或者 ./demo.sh &> demo.log
。这两种方法都能确保标准输出和标准错误都写入到同一个文件 demo.log
中。需要避免多次或错误地重定向标准输出和标准错误到同一个文件,这可能会导致输出内容丢失或覆盖。