從bash(1)
手冊頁:
管道中的每個命令被作爲一個單獨的處理中執行(即,在一個子shell)。
因此,cd
不能在管道使用時改變當前shell的工作目錄。要解決這個限制,通常的做法是與其他命令組cd
和重定向組命令的輸出:
{
cd /usr/local/src
command1
command2
} | tee --append ~/max.log
沒有破壞你現有的設計,你可以代替你的過濾函數處理cd
專門:
# eval all commands (will catch any cd output, but will not change directory):
eval $1 2>&1 >>~/max.log | tee --append ~/max.log
# if command starts with "cd ", execute it once more, but in the current shell:
[[ "$1" == cd\ * ]] && $1
根據您的情況,這可能是不夠的:您可能必須處理修改環境或shell變量,如set
,history
,ulimit
其他命令,read
,pushd
和popd
。在這種情況下,重新考慮該程序的設計可能是一個好主意。
什麼不行?它沒有cd到目錄中? – edi9999
cd不能很好地處理管道,'cd folder |例如ls'不會將您置於「文件夾」 – edi9999
您可以將main函數移動到一個函數中並使用'tee'作爲函數輸出嗎?像'function mymain {...}'和'mymain 2>&1 | tee -append〜/ max.log'?或者使用'script'之類的東西? –