Shell

帶有重定向到記錄器的 CD 不起作用

  • August 1, 2015

在 Linux 上,以下 cd 工作正常,因此 cds 進入 tmp:

/ # cd /tmp
tmp # 

但這不起作用(停留在根目錄,/var/log/messages 中沒有任何內容)。為什麼不?

/ # cd /tmp 2>&1 | /usr/bin/logger -t Test
/ #

我嘗試剝離這個 stderr 重定向,但這也沒有用。

我的目標是將我的腳本的所有輸出重定向到 syslog,所以如果我嘗試在不存在/權限被拒絕/等的目錄中進行 CD。為什麼它不起作用以及如何使它起作用?

正常的迴聲確實會列印到 syslog,這樣就可以了:

echo Test | /usr/bin/logger -t Test

管道並行執行生產者(左手)程序和消費者(右手)程序。由於有兩個並行的程序,至少其中一個需要是主shell程序的子程序,可能兩者都是。

大多數 shell 在子程序中執行管道的兩側。ATT ksh 和 zsh 在原始程序中執行右側。

cd命令更改目前 shell 程序的目前目錄,因此它需要是一個內置的. 由於管道的左側在子shell(從執行腳本的shell 程序派生cd的子程序)中執行,因此該命令僅在子shell 中生效。它可以工作,但由於子shell 之後立即退出,它沒有做任何有用的事情。你可以觀察它

{ cd /tmp; echo -n "left-hand side: "; pwd; } | 
{ cd /usr; echo -n "right-hand side: "; pwd; }
echo -n "parent: "; pwd

要記錄腳本的輸出,請創建一個適用於整個腳本的管道。

main () {
 … # whole script goes here
}
main | logger

引用自:https://unix.stackexchange.com/questions/219601