Shell-Script

短劃線等效於腳本輸出的自我重定向

  • February 2, 2016

在 Bash 中,您可以重定向目前正在執行的腳本的所有未來標準輸出輸出。例如,使用此腳本,

exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3

這將在 syslog 中結束:

Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3

但這是特定於 Bash 的,帶有重定向的裸 exec 似乎在 Dash 中不起作用。

Syntax error: redirection unexpected

我怎樣才能讓它在 Dash 中工作,或者可能在兩個 shell 中工作?

你可以這樣做:

{ commands
....
} | logger -t my_awesome_script

你可以用任何外殼來做到這一點。

如果您不喜歡它的外觀,也許可以讓腳本將自己包裝在一個函式中。

#!/bin/sh
run() if     [ "$run" != "$$" ] || return
     then   sh -c 'run=$$ exec "$0" "$@"' "$0" "$@" |
            logger -t my-awesome-script
     fi
#script-body
run "$@" || do stuff

使用命名管道很容易模擬程序替換。

mkfifo logger_input
logger -t my_awesome_script < logger_input &
exec > logger_input
echo 1
echo 2
echo 3

事實上,命名管道是一種機制(另一種是/dev/fd),可以在bash.

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