2013-07-19 20 views
6

Bunu bulmaya çalışıyorum ama elimden bir şey bulamadım. Eminim cevap doğrudur.Bir kabuk komut dosyasını, sh yerine bash altında çalışacak şekilde zorlamak için bir yol var mı?

Farklı kişiler tarafından çalıştırılmak üzere çeşitli amaçlarla bazı kabuk komut dosyaları yazıyorum ve bazıları komut dosyasını "bash" yerine "sh" ile çağırıyor olabilir. o "se" ile çağrılan olsa bile bash altında çalıştırılacak komut zorlamak için bir yol yoktur -

komut normal kabuk ortamda faaliyet ve bash gerekmez araçları içerir?

+0

@shellter: demek istediniz '/ usr/bin/env '/ bin/env' değil; Benim sistemim örneğin/bin/env' içermiyor. Ayrıca bkz. [Bu soru] (http://unix.stackexchange.com/q/29608/10454) ve [yanıtım] (http://unix.stackexchange.com/a/29620/10454). –

+0

Bu sorunun yararlı olduğuna ve kurallara uymaya devam edebileceğine inanıyorum, örn. o kadar başka şekilde ifade edilmiştir değil, konu dışı eğer sadece "Nasıl yerine sh bash altında yürütmek zorlamak için senaryomu değiştirecek mi?" (Başlık olarak hemen hemen aynı) – Programster

cevap

24

As Richard Pennington says, bunu doğru yolu senaryonun ilk satırı olarak

#!/bin/bash 

sahip olmaktır.

Ama bu kullanıcıların açıkça sh kullanarak çağırmak durumunda yardım etmeyecek. Örneğin, eğer #! çizgi göz ardı edilecektir

sh your-script-name 

yazın.

Bunu yapmaktan engellemek gerçekten , ancak komut dosyası üstündeki böyle bir şey ekleyerek vazgeçirmek olabilir:

#!/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 

Yoksa böyle bir şey yapabileceğini:

#!/bin/bash 

if [ ! "$BASH_VERSION" ] ; then 
    exec /bin/bash "$0" "[email protected]" 
fi 

Ancak bu çok yanlış çok kolay gidebilir; Örneğin, normalde komut dosyasının adı olan $0'un aslında onu çağırmak için kullanabileceğiniz bir ad olduğu garanti edilemez. Bunu yanlış anlamışsanız veya sisteminiz biraz yanlış yapılandırılmışsa, sonsuz bir döngüye girmeyi hayal edebiliyorum.

Hata mesajı yaklaşımını öneririm.

(Not: Hata mesajı kullanıcılara yararlı olabilecek senaryo, adını içerir yüzden sadece bu cevabı kaydetmiştiniz.)

+0

Cevabınız için teşekkür ederiz. Üstte belirtilen satırı aldım ve bir hata atmak için bash sürümlerini kontrol edebileceğimi bilmiyordum. Bu güzel yapacak, teşekkürler! – Locane

+0

Genellikle, diğer kabuklar (ksh veya zsh gibi) işe yarayabilir. Onları da kontrol etmek isteyebilirsiniz. – Demi

2
#! /bin/bash 
# The rest of your script. 
İlgili konular