![在 shell 腳本中使用記錄器](https://rvso.com/image/623627/%E5%9C%A8%20shell%20%E8%85%B3%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%E8%A8%98%E9%8C%84%E5%99%A8.png)
如何在 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)
:
- 跑步
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 與預設 shell 不同的 shell(可能是 bash)
要檢查,請嘗試使用 /bin/sh ./yourscript 運行腳本,或將與 $SHELL 相同的 shell 放入腳本中
/bin/sh 使用哪個 shell 可能取決於發行版,如果您使用的是 Solaris,則情況完全不同。