![互動運行或透過 cron 運行時,腳本 bash 無法獲得 $PS1 或 $- 的差異](https://rvso.com/image/617241/%E4%BA%92%E5%8B%95%E9%81%8B%E8%A1%8C%E6%88%96%E9%80%8F%E9%81%8E%20cron%20%E9%81%8B%E8%A1%8C%E6%99%82%EF%BC%8C%E8%85%B3%E6%9C%AC%20bash%20%E7%84%A1%E6%B3%95%E7%8D%B2%E5%BE%97%20%24PS1%20%E6%88%96%20%24-%20%E7%9A%84%E5%B7%AE%E7%95%B0.png)
我希望我的 cron 腳本在由系統使用者互動運行時詳細執行(例如用於偵錯目的),否則安靜地執行(對於 cron,因為當且僅當我收到錯誤時我希望收到電子郵件)。
我在我的腳本中嘗試過這個:
case "$-" in
*i*) echo "this shell is interactive" > /tmp/log;
*) echo "this shell isn't" > /tmp/log;
esac
但即使以交互方式運行(/bin/bash /tmp/my_script.sh),它也總是返回“this shell isn't”並且
echo $-
在 shell 腳本中傳回 hB 而不是 hiB。
我也嘗試過
if [ -z $PS1 ]
認為 cron 沒有設定 $PS1,但再次從提示符處, echo $PS1 返回此變量,並在腳本中交互地返回任何內容:/
我想知道為什麼互動式地(/bin/bash my_script.sh)不會傳回 $- 的 i 值,也不會傳回 $PS1 的值。
非常感謝您的幫忙!
答案1
你可以檢查 stdin 是否為 tty。
或者,您可以在腳本中添加一個標誌,告訴它要安靜或詳細,而不是讓它猜測。
答案2
您可以在 cron 中設定一個環境變量,並檢查它。
將 THISSCRON=1 單獨放在 cron 條目上方的一行上。
答案3
Bash 腳本從來沒有開啟互動選項。它們在任何地方都是非互動的。