![シェルスクリプトでロガーを使用する](https://rvso.com/image/623627/%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%83%AD%E3%82%AC%E3%83%BC%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B.png)
シェル スクリプトで logger を使用するにはどうすればよいですか?
もし私が走ったら
ntpd -qnp pool.ntp.org 2> >(logger)
コンソールでは期待どおりに動作します。
これをシェルスクリプトに書き込むと
#!/bin/sh
ntpd -qnp pool.ntp.org 2> >(logger)
次のエラーが発生します:
line 2: syntax error: unexpected redirection
exited with code 2
シェルスクリプトの何が間違っているのでしょうか?
答え1
#!/bin/sh と #!/bin/bash の両方が使用できるため、シェバンは正しいですが*、私の記憶が正しければ、ロガーはファイルではなくプログラムであるため、リダイレクトではなくパイプを使用する必要があります。
次のスクリプトを試してください:
#!/bin/sh
ntpd -qnp pool.ntp.org 2>&1 |logger
*スクリプトに #!/bin/sh を使用する場合、スクリプトは POSIX 準拠、つまり Solaris および AIX で正常に実行される必要があります。bash 固有の機能を使用する場合は、移植性がなくなるため、#!/bin/bash を使用する必要があります。
答え2
間違っているのは、ハッシュバングが と言っているのに、bash-ism を使用していることです/bin/sh
。 に変更する#! /bin/bash
と動作します。
答え3
実際に、この行が何をするのか確認する必要がありましたntpd -qnp pool.ntp.org 2> >(logger)
。
- 走る
ntpd -qnp pool.ntp.org
- stderr
2>
を使用してリダイレクトします... 正確にはどこに? そうですね.... >(logger)
- 名前付きパイプを作成します(機構)、 あれを呼べ
/dev/fd/pipe100
logger
そのパイプからSTDINを読み取りプロセスを開始します/dev/fd/pipe100
コマンドに名前を代入する
- 名前付きパイプを作成します(機構)、 あれを呼べ
- ...こうして走る
ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
- ...プロセスが
logger
そのパイプから読み取りを行っている間:logger < /dev/fd/pipe100
上記は bash でうまく動作するはずです。
ただし、明示的に「sh」を使用して実行しようとすると、次の結果になります。
script.sh: line 3: syntax error near unexpected token `>'
したがって、他のコメント投稿者が指摘したように、ここではおそらく bash を使用していないことになります。
実際、Busyboxはアルムクイストシェルデフォルトでは。
答え4
おそらく、/bin/sh にはデフォルトのシェル(おそらく bash)とは異なるシェルがあります。
確認するには、/bin/sh ./yourscriptでスクリプトを実行するか、$SHELLと同じシェルをスクリプトに入れてください。
/bin/sh に使用されるシェルは、おそらくディストリビューションに依存しており、Solaris の場合はまったく異なります。