在 shell 腳本中使用記錄器

在 shell 腳本中使用記錄器

如何在 shell 腳本中使用記錄器?

如果我跑

ntpd -qnp pool.ntp.org 2> >(logger)

在控制台中,它按預期工作。

如果我把它放入 shell 腳本中

#!/bin/sh
ntpd -qnp pool.ntp.org 2> >(logger)

我收到以下錯誤:

line 2: syntax error: unexpected redirection
exited with code 2

shell腳本有什麼問題?

答案1

shebang 是正確的,因為 #!/bin/sh 和 #!/bin/bash 都可以使用*,但是,IIRC,您應該使用管道而不是重定向記錄器,因為它是程式而不是檔案。

試試這個腳本:


#!/bin/sh
ntpd -qnp pool.ntp.org 2>&1 |logger

*如果您的腳本使用#!/bin/sh,它們應該與 posix 相容,即在Solaris 和AIX 上運作良好。如果您使用某些 bash 特定功能,則必須使用 #!/bin/bash,因為不再具有可移植性。

答案2

問題在於你使用的是 bash-ism,而你的 hash-bang 卻在說/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 與預設 shell 不同的 shell(可能是 bash)

要檢查,請嘗試使用 /bin/sh ./yourscript 運行腳本,或將與 $SHELL 相同的 shell 放入腳本中

/bin/sh 使用哪個 shell 可能取決於發行版,如果您使用的是 Solaris,則情況完全不同。

相關內容