Bash: bir komut dosyasındaki execute vs source algılansın mı?


19

Düzgün çalışması için benim kabuk olması gereken bazı küresel ortam değişkenleri (LD_LIBRARY_PATH, PATH, ROOTDIR, vb.) Ayarlar dosya sistemimi (bir oluşturma işleminin yan etkisi) çevrili bir komut dosyası var. Tabii ki, bu, işe source script.shya da . script.shişe ./script.shkoymam gerektiği anlamına geliyor ve değil (yeni bir kabuk oluşturacak ve mevcut kabuğumdaki değişkenleri ayarlamayacak).

Birinin çalışmasını önlemek (veya uyarmak) için betiğe ekleyebileceğim bir şey var mı ./script.sh?

Yanıtlar:


15

Bir kabuk komut dosyasında, $0şu anda çalışan komut dosyasının adıdır. Kaynak alıp almadığınızı veya şu şekilde çalışıp çalışmadığınızı söylemek için bunu kullanabilirsiniz:

if [[ "$(basename -- "$0")" == "script.sh" ]]; then
    echo "Don't run $0, source it" >&2
    exit 1
fi

5

En basit yol bash:

if [ "$0" = "$BASH_SOURCE" ]; then
    echo "Error: Script must be sourced"
    exit 1
fi

$BASH_SOURCE her zaman komut dosyasının adını / yolunu içerir.

$0 yalnızca kaynak OLMADIĞINDA komut dosyasının adını / yolunu içerir.

Yani eşleştiklerinde, komut dosyasının kaynaklanmadığı anlamına gelir.



1

Başka bir seçenek de yürütme izinlerini kaldırmak olabilir. Bu durumda yürütülemez ancak yine de kaynak sağlanabilir.


1
Bu eksik. bash scriptBir komut dosyasındaki yürütme bayrağına bakılmaksızın komut dosyaları çalıştırabilirsiniz. Ayrıca Cygwin altında (bu sayılır mı?) Yürütme bayraklarını kaldıramazsınız.
Tino

0

Örneğin, $ 0 ( Mikel yanıtı) kontrolüne ek olarak, uzantıyı .sh'den .src'ye değiştirmek yararlı olabilir. Bu komut dosyasını yürütmemesi gereken kimseyi anlamanıza yardımcı olacaktır.


0

Özel bir yorumlayıcı oluşturun source_reminder:

#!/bin/sh
printf "%s\n" "Source me!" >&2
exit 1

Yürütülebilir hale getirmeyi unutmayın. Sonra sadece betiğinizde kullanın:

#!/path/to/your/source_reminder
foo
bar
whatever

Şimdi komut dosyasını kaynak kullanmadan çalıştırırsanız, hatırlatıcı işini yapar.


İyi yakaladın. #!/bin/echo do not executeveya #!/bin/falseveya #!/usr/bin/awk BEGIN { print "you must source " ARGV[1]; exit(1) }. Ancak bu, betiğin böyle bir şeyle yürütüldüğü durumu yakalamaz sh script(bu, Shebang'ı yok sayar).
Tino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.