関数の理解(Bash)

関数の理解(Bash)

Bashスクリプトで使用される次の関数を確認してください。

LOG_FILE="/root/collect.log";\
date_info() {
        local cmd; cmd=$(basename $0)
        echo "$(date --rfc-3339=seconds) $cmd.info: $*" >>"$LOG_FILE"
        >&2 echo "$cmd.info: $*"
}

誰かがこの機能を理解するのに役立ちますか?私はすべてがパス内のlog_fileに収集されることを知っていますが、/root/collect.log日付と時刻を除いて詳細を理解することはできません。

ありがとう、台東

ベストアンサー1

本質的には単にロギング機能です。

local cmd; cmd=$(basename $0)

これはcmdローカル変数として宣言されているため、この関数内でのみ使用できます。割り当てられた値は、$(basename $0)シェルまたはシェルスクリプトの名前に展開されます。

echo "$(date --rfc-3339=seconds) $cmd.info: $*" >>"$LOG_FILE"

ここに日付が表示されます。rfc-3339形式(これはGNU dateでのみ利用可能なオプションである可能性があるため、コマンドの移植性が低下する可能性があります。)以下で実行すると、追加されるcmd値は次のようになります。.info:script.shscript.sh.info:$*の最初の文字で拡張された関数に与えられたすべての引数を表しますIFS

date_info unable to do the thingしたがって、ログファイルでこのコマンドを実行すると、script.shログファイルに次の行が表示されます。

2022-04-20 06:35:00-06:00 script.sh.info: unable to do the thing

最後の行:

>&2 echo "$cmd.info: $*"

この行はstdoutをstderrにリダイレクトし、デフォルトで同じ内容(日付を除く)を端末にエコーします。


そして;\最後の部分はLOG_FILE="/root/collect.log";\ちょっと無意味ですね。 ;はシェルスクリプトの改行の末尾に不要なコマンド区切り文字で、\次の改行をエスケープします。お互いをキャンセルして削除できます。

おすすめ記事