Geri aldın. /bin/sh
bu günlerde neredeyse hiç Bourne kabuğu değildir ve o zaman, bir dişi #! /bin/sh
patlama kullandığınızda bir probleminiz vardır .
Bourne kabuğu, 70'lerin sonlarında yazılmış ve önceki Thompson kabuğunun (aynı zamanda da denir sh
) yerini alan bir kabuktu . 80'lerin başında, David Korn Bourne kabuğu için birkaç uzantı yazdı, birkaç hatayı düzeltti ve gariplikleri tasarladı (ve bazılarını tanıttı) ve buna Korn kabuğu adını verdi.
90'lı yılların başlarında POSIX, sh
dili Korn kabuğunun bir alt kümesine göre belirledi ve çoğu sistem şimdi bunları /bin/sh
Korn kabuğuna veya bu spesifikasyona uygun bir kabuğa değiştirdi. BSD'ler söz konusu olduğunda /bin/sh
, başlangıçta (Bourne kabuğunu lisans nedenleriyle artık kullanamadıktan sonra), Bourne kabuğunun bir klonu olan ksh uzantılarına sahip bir klon olan Almquist kabuğunu yavaş yavaş değiştirdiler ve POSIX uyumlu oldu.
Bugün, tüm POSIX sistemleri çoğunlukla POSIX uyumlu olan bir kabuğa sahiptir sh
(çoğunlukla, ancak zorunlu olarak /bin
, POSIX belirttiği yardımcı programların yolunu belirtmez). Genellikle ksh88, ksh93, pdksh, bash, ash veya zsh²'ye dayanır, ancak Bourne kabuğu asla POSIX uyumlu olmadığından Bourne kabuğu değil³. Bu kabukların birkaç ( bash
, zsh
, yash
ve bazı pdksh
olarak çağrıldığında türevleri, POSIX uyumlu modu etkinleştirmek sh
ve vardır daha başka şekilde uyumlu).
bash
(Korn kabuğuna yapılan GNU cevabı) aslında tek açık kaynak kabuğudur (ve şu anda sadece diğeri genellikle 90'lardan beri yeni bir özellik kazanmamış olan ksh88'e dayandığı için korunabilir) POSIX uyumlu olması sh
(macOS sertifikasının bir parçası olarak).
#! /bin/sh -
She-bang ile bir komut dosyası yazdığınızda , standart bir sh
sözdizimi kullanmalısınız (ve taşınabilir olmak istiyorsanız bu komut dosyasında kullanılan yardımcı programlar için standart sözdizimi de kullanmalısınız, yalnızca bir kabuk yorumlanırken kabuk değil komut dosyası) kullanırsanız, o standart sh
sözdizimi yorumlayıcısının hangi uygulamasının kullanıldığı önemli değildir ( ksh
, bash
...).
Bu mermileri kullanmadığınız sürece standardın üzerinde uzantılara sahip olması önemli değil. Standart C kodu yazdığınızda ve bir derleyicinin (örneğin gcc
) veya diğerinin uzantılarını kullanmadığınız sürece, C kodu yazmak gibidir , derleyicinin uyumlu olması koşuluyla derleyici uygulamasından bağımsız olarak kodunuz derlenmelidir.
İşte, birlikte #! /bin/sh
dişi patlamayla, sizin asıl sorun sistem olacağını /bin/sh
Bourne kabuğu olduğunu örneği gibi standart özellikleri desteklemiyor için $((1+1))
, $(cmd)
, ${var#pattern}
... sen alternatif çözüm gibi gerekebilir durumda:
#! /bin/sh -
if false ^ true; then
# in the Bourne shell, ^ is an alias for |, so false ^ true returns
# true in the Bourne shell and the Bourne shell only.
# Assume the system is Solaris 10 (older versions are no longer maintained)
# You would need to adapt if you need to support some other system
# where /bin/sh is the Bourne shell.
# We also need to fix $PATH as the other utilities in /bin are
# also ancient and not POSIX compatible.
PATH=`/usr/xpg6/bin/getconf PATH`${PATH:+:}$PATH || exit
export PATH
exec /usr/xpg4/bin/sh "$0" "$@"
# that should give us an environment that is mostly compliant
# to the Single UNIX Specification version 3 (POSIX.2004), the
# latest supported by Solaris 10.
fi
# rest of the script
Bu arada, Ubuntu varsayılan /bin/sh
olarak değil bash
. Bu var dash
bugünlerde, NetBSD dayalı bir kabuk sh
çoğunlukla çok baytlık karakterleri desteklemez dışında POSIX uyumludur Almquist kabuğu dayalı kendisi. Ubuntu ve diğer Debian tabanlı sistemlerde, arasında seçim yapabilirsiniz bash
ve dash
için /bin/sh
birlikte dpkg-reconfigure dash
) 4 . sh
Debian ile gönderilen komut dosyaları, Debian politika standardına (POSIX standardının bir üst kümesi) yazıldıkları her iki kabukta da aynı şekilde çalışmalıdır. Muhtemelen çalışma Tamam da onlar bulacaksınız zsh
bireyin sh
öykünme veya bosh
(muhtemelen ksh93
ne de yash
bir bizde olmayan local
Debian politikası değil POSIX) tarafından gerekli yerleşiği ().
Unix.stackexchange.com adresindeki tüm sistemlerde bir POSIX vardır sh
. Çoğu ( /bin/sh
bir /bin
dizini olmayan çok nadir bulunanları bulabilirsiniz, ancak muhtemelen bunu umursamıyorsunuz) ve bu genellikle bir POSIX sh
yorumlayıcısı (ve nadir durumlarda bunun yerine (standart olmayan) bir Bourne kabuğu ).
Ancak sh
, bir sistemde bulabileceğinizden emin olabileceğiniz tek kabuk yorumlayıcısıdır. Diğer mermiler için macOS, Cygwin ve çoğu GNU / Linux dağıtımının olacağından emin olabilirsiniz bash
. SYSV türevi işletim sistemlerinde (Solaris, AIX ...) genellikle ksh88, muhtemelen ksh93 olacaktır. OpenBSD, MirOS'un bir pdksh türevi olacaktır. macOS sahip olacak zsh
. Ama bundan, hiçbir garanti olmayacak. bash
Bu diğer mermilerin /bin
ya da başka bir yere monte edilip edilmeyeceğine veya herhangi bir yere monte edileceğine dair bir garanti yoktur ( /usr/local/bin
örneğin, monte edildiğinde genellikle BSD'lerde bulunur). Ve elbette kurulacak olan kabuğun versiyonunun garantisi yok.
Bunun #! /path/to/executable
bir kural olmadığını unutmayın , tüm Unix benzeri çekirdeklerin ( Dennis Ritchie tarafından 80'lerin başında tanıtıldı ), ilk satırda yorumlayıcının yolunu belirterek keyfi dosyaların yürütülmesine izin veren bir özelliktir #!
. Herhangi bir yürütülebilir olabilir.
Kimin ilk satırı başlar bir dosyayı çalıştırdığınızda #! /some/file some-optional-arg
, çekirdek yürütme biter /some/file
ile some-optional-arg
senaryonun yolu ve argümanlar gibi orijinal argümanlar. Ne olduğunu #! /bin/echo test
görmek için ilk satırı yapabilirsiniz :
$ ./myscript foo
test ./myscript foo
Kullandığınızda /bin/sh -
yerine /bin/echo test
çekirdek çalıştırır, /bin/sh - ./myscript foo
, sh
içerik saklanan kodunu yorumlar myscript
bir yorum (başlar beraber olarak ve göz ardı eder İlk satır #
).
Today Muhtemelen bugün herhangi birimizin /bin/sh
Bourne kabuğuna dayanan bir sistemle karşılaşacağı tek sistem Solaris 10'dur. Solaris, Bourne kabuğunu geriye dönük uyumluluk için orada tutmaya karar veren birkaç Unice'den biridir (POSIX sh
dili tam değildir. Bourne kabuğuyla geriye dönük uyumlu) ve (en azından masaüstü ve tam sunucu dağıtımları için) sh
başka bir yerde /usr/xpg4/bin/sh
POSIX'e sahiptir ( ksh88'e dayalı olarak), ancak /bin/sh
şu anda ksh93 olan Solaris 11'de değişmiştir . Diğerleri çoğunlukla geçersizdir.
² eskiden MacOS / X , ancak daha sonra değiştirildi . POSIX uygulaması olarak kullanılmak birincil odak noktası değildir . Onun mod embed veya çağrı (edebilmek için öncelikle ) POSIX kod komut/bin/sh
zsh
bash
zsh
sh
sh
source
sh
zsh
³ Son zamanlarda, @schily , POSIX uyumlu olmak için OpenSolaris kabuğunu (Bourne kabuğuna dayanan SVR4 kabuğundaki taban) çağırdı, bosh
ancak henüz herhangi bir sistemde kullanıldığının farkında değilim. Bununla birlikte ksh88
, Bourne kabuğunun koduna dayanan ikinci bir POSIX uyumlu kabuk yapar
4 Daha eski sürümlerde mksh
veya POSIX lksh
enkarnasyonunu da kullanabilirsiniz . Bu, Forsyth kabuğuna (Bourne kabuğunun başka bir yeniden uygulaması) dayanan pdksh'ye dayanan MirOS (eski adıyla MirBSD) kabuğudır)