我一直在尋找這個東西,但我找不到任何東西。我相信答案很簡單。有沒有辦法強制shell腳本在bash而不是sh下運行?
我正在編寫一些用於各種目的的shell腳本,由不同的人運行,其中一些腳本可以用「sh」而不是「bash」來調用腳本。
該腳本包含的工具不能在常規shell環境下運行,並且需要bash - 是否有辦法強制腳本在bash下運行,即使它是用「sh」調用的?
我一直在尋找這個東西,但我找不到任何東西。我相信答案很簡單。有沒有辦法強制shell腳本在bash而不是sh下運行?
我正在編寫一些用於各種目的的shell腳本,由不同的人運行,其中一些腳本可以用「sh」而不是「bash」來調用腳本。
該腳本包含的工具不能在常規shell環境下運行,並且需要bash - 是否有辦法強制腳本在bash下運行,即使它是用「sh」調用的?
As Richard Pennington says,做正確的方式是讓
#!/bin/bash
爲腳本的第一行。
但是,如果用戶明確使用sh
來調用它,那就沒有幫助。例如,如果我輸入
sh your-script-name
的#!
線將被忽略。
你真的不能防止人這樣做,但你可以通過在腳本的頂部添加類似這樣勸阻:
#!/bin/bash
if [ ! "$BASH_VERSION" ] ; then
echo "Please do not use sh to run this script ($0), just execute it directly" 1>&2
exit 1
fi
或者你可以這樣做:
#!/bin/bash
if [ ! "$BASH_VERSION" ] ; then
exec /bin/bash "$0" "[email protected]"
fi
但這可能會非常容易出錯,例如,可能無法保證$0
(通常是腳本的名稱)實際上是可用於調用它的名稱。我可以想象,如果你弄錯了,或者你的系統稍微配置不當,我會想象它會陷入無限循環。
我推薦錯誤信息的方法。
(注:這樣的錯誤消息中包含的腳本,這可能是對用戶有幫助的名字我剛剛編輯這個答案。)
#! /bin/bash
# The rest of your script.
@shellter:我想你的意思'在/ usr/bin中/ ENV ',而不是'/ bin/env';例如,我的系統沒有'/ bin/env'。另見[這個問題](http://unix.stackexchange.com/q/29608/10454)和[我的回答](http://unix.stackexchange.com/a/29620/10454)。 –
我認爲這個問題很有用,可能仍然遵守規則,例如而不是脫離主題,如果它被重寫爲「如何改變我的腳本以迫使它在bash而不是sh下執行?」 (與標題非常相似) – Programster