Geri aldın. /bin/shbu günlerde neredeyse hiç Bourne kabuğu değildir ve o zaman, bir dişi #! /bin/shpatlama 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/shKorn 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, yashve bazı pdksholarak çağrıldığında türevleri, POSIX uyumlu modu etkinleştirmek shve 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 shsö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 shsö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/shdişi patlamayla, sizin asıl sorun sistem olacağını /bin/shBourne 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/sholarak değil bash. Bu var dashbugü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 bashve dashiçin /bin/shbirlikte dpkg-reconfigure dash) 4 . shDebian 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 zshbireyin shöykünme veya bosh(muhtemelen ksh93ne de yashbir bizde olmayan localDebian 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/shbir /bindizini olmayan çok nadir bulunanları bulabilirsiniz, ancak muhtemelen bunu umursamıyorsunuz) ve bu genellikle bir POSIX shyorumlayı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. bashBu diğer mermilerin /binya 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/executablebir 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/fileile some-optional-argsenaryonun yolu ve argümanlar gibi orijinal argümanlar. Ne olduğunu #! /bin/echo testgö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, shiçerik saklanan kodunu yorumlar myscriptbir yorum (başlar beraber olarak ve göz ardı eder İlk satır #).
Today Muhtemelen bugün herhangi birimizin /bin/shBourne 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 shdili 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) shbaşka bir yerde /usr/xpg4/bin/shPOSIX'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/shzshbashzshshshsourceshzsh
³ Son zamanlarda, @schily , POSIX uyumlu olmak için OpenSolaris kabuğunu (Bourne kabuğuna dayanan SVR4 kabuğundaki taban) çağırdı, boshancak 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 mkshveya POSIX lkshenkarnasyonunu 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)