Bu belgelenmiş bir özelliktir.
Bash adlı bir symlink aracılığıyla çalıştırırsanız sh
, bash sh
uyumluluk modunda başlar.
Gönderen man bash
:
Bash sh adıyla çağrılırsa, POSIX standardına da uyurken, sh'in eski sürümlerinin başlatma davranışını mümkün olduğunca yakından taklit etmeye çalışır. Etkileşimli bir giriş kabuğu veya --login seçeneğiyle etkileşimli olmayan bir kabuk olarak çağrıldığında, önce / etc / profile ve ~ / .profile komutlarını bu sırayla okumaya ve yürütmeye çalışır. --Noprofile seçeneği bu davranışı engellemek için kullanılabilir. Sh adıyla etkileşimli bir kabuk olarak çağrıldığında, bash ENV değişkenini arar, tanımlanmışsa değerini genişletir ve genişletilmiş değeri okumak ve yürütmek için bir dosyanın adı olarak kullanır. Sh olarak çağrılan bir kabuk başka herhangi bir başlangıç dosyasındaki komutları okumaya ve yürütmeye çalışmadığından, --rcfile seçeneğinin bir etkisi yoktur. Sh adıyla çağrılan etkileşimli olmayan bir kabuk, başka herhangi bir başlangıç dosyasını okumaya çalışmaz. Sh olarak çağrıldığında, başlangıç dosyaları okunduktan sonra bash posix moduna girer.
Bir program başlatmak için hangi adın kullanıldığını nasıl bilir?
Bir ac programı ise, inceleyebilir argv[0]
. Bir kabuk veya perl betiği ise inceleyebilir $0
.
Örnek olarak, bu basit kabuk komut dosyasını ele alalım:
$ cat utc
#!/bin/sh
case "${0##*/}" in
utc) date -u ;;
et) TZ=US/Eastern date ;;
esac
$0
betiğin çağrıldığı addır. ${0##*/}
herhangi bir dizin adı kaldırıldığında komut dosyasının çağrıldığı addır.
Bu symlink'i oluşturalım:
ln -s utc et
Yani, utc
ve et
her ikisi de aynı yürütülebilir çalıştırmak ancak farklı sonuçlar sağlar. Olarak çalıştırıldığında utc
, evrensel zaman verir. Olarak çalıştırıldığında et
, çıktı ABD Doğu zamanı. Örneğin:
$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016