シェルスクリプトでロガーを使用する

シェルスクリプトでロガーを使用する

シェル スクリプトで 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)

  1. 走るntpd -qnp pool.ntp.org
  2. stderr2>を使用してリダイレクトします... 正確にはどこに? そうですね....
  3. >(logger)
    1. 名前付きパイプを作成します(機構)、 あれを呼べ/dev/fd/pipe100
    2. loggerそのパイプからSTDINを読み取りプロセスを開始します
    3. /dev/fd/pipe100コマンドに名前を代入する
  4. ...こうして走るntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
  5. ...プロセスが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 の場合はまったく異なります。

関連情報