Başlangıçta hiçbir shebang satırı (#! / Path / to / shell) olmadığında hangi kabuk komut dosyalarını yürütür? / Bin / sh varsayıyorum ama onaylayamıyorum.
Kesin davranış programına bağlıdır böylece çekirdek tür senaryo ve getiri yürütmek reddediyor ENOEXEC, böyle bir komut dosyasını çalıştırın gelen .
- bash 4.2.39 - kendini kullanır
- busybox-ash 1.20.2 - kendini kullanır
- tire 0.5.7 - çalışır / bin / sh
- balık 1.23.1 - ENOEXEC'ten şikayetçi, sonra yanlış dosyayı suçluyor
- AT&T ksh 93u + 2012.08.01 - kendini kullanır
- mksh R40f - çalışır / bin / sh
- pdksh 5.2.14 - çalışır / bin / sh
- sh-heirloom 050706 - kendini kullanır
- tcsh 6.18.01 - çalışır / bin / sh
- zsh 5.0.0 - çalışır / bin / sh
- cmd.exe 5.1.2600 - komik görünüyor.
In glibc'nin , fonksiyonlar execv()
veya execve()
sadece ENOEXEC döner. Ancak execvp()
bu hata kodunu gizler ve otomatik olarak / bin / sh komutunu çağırır. (Bu, exec'de (3p) belgelenmiştir .)
Herhangi bir platformda çalıştırılacak olan kabuk betikleri yazma açısından "en iyi uygulamalar" olarak kabul edilen nedir? (tamam, bu bir tür açık uçlu)
Ya sh
POSIX tanımlı özelliklere sadık kalın ya da sadece tam bash'a (yaygın olarak kullanılabilir) gidin ve dağıtırsanız gereksinimlerinizden bahsedin.
(Şimdi düşündüğümde, Perl - veya belki de Python - daha iyi bir sözdizimine sahip olmaktan bahsetmiyorum bile daha taşınabilir olurdu.)
Daima mesele hattını ekleyin. Bash veya zsh kullanıyorsanız #!/usr/bin/env bash
, kabuğun yolunu kodlamak yerine kullanın . (Ancak, POSIX kabuğunun olduğu garanti edilir /bin/sh
, bu env
durumda atlayın .)
(Ne yazık ki, /bin/sh
her zaman aynı bile değildir. GNU autoconf programı birçok farklı tuhaflıkla uğraşmak zorundadır .)
Zsh'ı kullanmaya çalışan ve zsh yoksa bash'a geri dönen bir komut dosyası yazmak mümkün müdür? Aşağıdaki gibi iki shebang satır koyarak denedim, ama sadece kötü yorumlayıcı ile hatalar : / bin / zsh: zsh olmadan bir makinede denerseniz böyle bir dosya veya dizin yok .
Sadece bir shebang hattı olabilir; yeni satır karakterinden sonraki her şey çekirdek tarafından bile okunmaz ve kabuklar tarafından yorum olarak ele alınır.
Şu şekilde çalışan , hangi kabuğun kullanılabilir olduğunu kontrol eden ve sonuca bağlı olarak veya çalıştıran bir komut dosyası yazmak mümkündür . Ancak, bash ve zsh tarafından kullanılan sözdizimi çeşitli yerlerde o kadar farklı ki, bunu kendi akıl sağlığınız için yapmanızı tavsiye etmem .#!/bin/sh
exec zsh "$0" "$@"
exec bash "$0" "$@"