2013-07-19 40 views
6

我一直在尋找這個東西,但我找不到任何東西。我相信答案很簡單。有沒有辦法強制shell腳本在bash而不是sh下運行?

我正在編寫一些用於各種目的的shell腳本,由不同的人運行,其中一些腳本可以用「sh」而不是「bash」來調用腳本。

該腳本包含的工具不能在常規shell環境下運行,並且需要bash - 是否有辦法強制腳本在bash下運行,即使它是用「sh」調用的?

+0

@shellter:我想你的意思'在/ usr/bin中/ ENV ',而不是'/ bin/env';例如,我的系統沒有'/ bin/env'。另見[這個問題](http://unix.stackexchange.com/q/29608/10454)和[我的回答](http://unix.stackexchange.com/a/29620/10454)。 –

+0

我認爲這個問題很有用,可能仍然遵守規則,例如而不是脫離主題,如果它被重寫爲「如何改變我的腳本以迫使它在bash而不是sh下執行?」 (與標題非常相似) – Programster

回答

24

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(通常是腳本的名稱)實際上是可用於調用它的名稱。我可以想象,如果你弄錯了,或者你的系統稍微配置不當,我會想象它會陷入無限循環。

我推薦錯誤信息的方法。

(注:這樣的錯誤消息中包含的腳本,這可能是對用戶有幫助的名字我剛剛編輯這個答案。)

+0

謝謝你的回覆。我在頂部指定了一行,並且我不知道我可以檢查bash版本以引發錯誤。這樣做會很好,謝謝! – Locane

+0

通常,其他shell(如ksh或zsh)可能會工作。你可能也想檢查他們。 – Demi

2
#! /bin/bash 
# The rest of your script. 
相關問題