
在 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