Shell
帶有重定向到記錄器的 CD 不起作用
在 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