Shell
如何將所有輸出發送到 POSIX shell 中的“記錄器”?
我想在
.xprofile
使用時分別記錄標準輸出和標準錯誤logger
。在 Bash 中,我認為這看起來像這樣:exec 1> >(logger --priority user.notice --tag $(basename $0)) \ 2> >(logger --priority user.error --tag $(basename $0))
我將如何以POSIX **
/bin/sh
**兼容的方式做到這一點?
沒有 POSIX 等價物。您只能使用 執行重定向
exec
,而不能使用 fork。管道需要叉子,shell 等待子程序完成。一種解決方案是將所有程式碼放在一個函式中。
all_my_code () { … } { all_my_code | logger --priority user.notice --tag "$(basename "$0")"; } 2>&1 | logger --priority user.error --tag "$(basename "$0")"
(這也會記錄從 logger 的 stdout 實例到 stderr 實例的任何錯誤。您可以通過更多的文件描述符改組來避免這種情況。)
如果即使
logger
程序仍在執行也希望父 shell 退出,請將其放在呼叫&
的末尾。logger
{ all_my_code | logger --priority user.notice --tag "$(basename "$0")" & } 2>&1 | logger --priority user.error --tag "$(basename "$0")" &
或者,您可以使用命名管道。
pipe_dir=$(mktemp -d) mkfifo "$pipe_dir/out" "$pipe_dir/err" <"$pipe_dir/out" logger --priority user.notice --tag "$(basename "$0")" & <"$pipe_dir/err" logger --priority user.error --tag "$(basename "$0")" & exec >"$pipe_dir/out" 2>"$pipe_dir/err" … rm -r "$pipe_dir"