在 Freebsd 系统上,我运行 bash 脚本并尝试重定向输出:
% sudo bash some_file.sh arg1 >/dev/null 2>&1
Ambiguous output redirect.
% sudo bash some_file.sh arg1 &> /dev/null
Invalid null command.
答案1
似乎您在命令行上使用了 csh (使用 进行检查echo $SHELL
)。
- 使用 csh 语法重定向 stdout 和 stderr 将是:
sudo bash some_file.sh arg1 >& /dev/null
- 或者将重定向移动到命令的“bash 部分”
sudo bash -c 'some_file.sh arg1 >/dev/null 2>&1'
答案2
您已经很接近了,但是这两种语法都不是 TENEX C shell 的正确语法。
请记住:除非您进行了更改,否则您在 FreeBSD 上使用的交互式登录 shell 是 TENEX C shell。命令的重定向sudo
必须使用 TENEX C shell 的重定向语法。您是否通过 运行 Bourne Again shell 并不重要sudo
。这只是确定的重定向发生并sudo
已运行后。
这:
% sudo bash some_file.sh arg1 >/dev/null 2>&1实际上等同于
% >/dev/null >&1 sudo bash some_file.sh arg1 2它尝试将标准输出两次重定向到两个不同的位置。
这:
% sudo bash some_file.sh arg1 &> /dev/null实际上是
% sudo bash some_file.sh arg1 & > /dev/null并将在您的命令历史记录中被重写。它是由 , 连接的两个命令
&
,sudo
以及一个没有名称和参数的命令。 TENEX C shell 中不允许后者。
以下是将标准输出和标准错误重定向到/dev/null
TENEX C shell 的方法:
% sudo bash some_file.sh arg1 >& /dev/null