Komut dosyalarında, ilk satır yorumlayıcı yolunu belirtmelidir.
Ancak farklı sunucularda Linux, Unix veya BSD'de bu yol farklı olabilir.
Daha çok tercih edilen nedir?
#!/usr/bin/env bash
veya
#!/bin/bash
Komut dosyalarında, ilk satır yorumlayıcı yolunu belirtmelidir.
Ancak farklı sunucularda Linux, Unix veya BSD'de bu yol farklı olabilir.
Daha çok tercih edilen nedir?
#!/usr/bin/env bash
veya
#!/bin/bash
Yanıtlar:
Belirli bir yorumlayıcının sistem tarafından yüklenmiş sürümünü standart bir konuma yüklemek istiyorsanız, doğrudan yolu kullanın. Kullanıcının önce görünen yorumlayıcı sürümünü kullanmak istiyorsanız $PATH
kullanın #!/usr/bin/env ...
.
env
Komut ayarlayabilir veya unset ortam değişkenleri icar, belirli bir komutu çağırır:
env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &
Herhangi bir ortam değişkeni veya başka seçenek belirtmezseniz, yalnızca adlandırılmış komutu çağırır. (Bu şekilde kullanmak tartışmalı bir hack'tir.)
Mesele olarak yazma amacı
#!/usr/bin/env interp
interp
içinde ilk görünen şeyi çağırmaktır $PATH
.
Tam olarak senaryoyu yazarken, bilmek zorunda değilsiniz Bu araçlar, interp
(o da olabilir, eğer, diyelim olduğunu /bin
, /usr/bin
ya da /usr/local/bin
). Tabii ki bunu biliyor zorunda env
olduğunu /usr/bin/env
, ama bu makul evrensel olarak görünmektedir.
Avantajı, çeviricide kullanıcının hangi sürümünün ilk göründüğünü çağırmasıdır $PATH
. Dezavantaj tercüman diline doladığı hangisi sürümü kullanıcının ilk görünmesidir $PATH
.
Örneğin, ben bir kişisel yapı yükledim varsayalım perl
olarak, benim ev dizin altında $HOME/bin/perl
ve ben $HOME/bin
Sesimin önünde $PATH
. Mesleği olan bir senaryo çalıştırırsam
#!/usr/bin/env perl
kendi yüklü perl
yürütülebilir dosyam ile çalıştırılacak - bu iyi bir şey olmayabilir. Senaryonun yazarı muhtemelen bir ay önce kaynaktan yaptığım kör edici Perl ile test etmedi.
Çoğu sistemde ( /usr/bin/perl
ve /bin/bash
sırasıyla) tutarlı bir konuma kurulması muhtemel Perl veya Bash gibi bir şey için, komuta doğrudan yolu kullanırdım. Farklı sistemlere farklı şekilde kurulabilecek daha belirsiz bir şey için /usr/bin/env
, ya hile kullanırdım , ya da senaryo yüklenirken shebang satırını ayarlayan bir yükleyici yazardım. (Bunu Perl scriptlerim için yapardım.)
GÜNCELLEME: Ben biraz daha detaya gittin bu cevap için bu soruya üzerinde Unix & Linux sitesinde .
#!/usr/bin/perl
ve sonra kullanmak gelenekseldir . Ama mesele üzerinde olmalı. use strict; use warnings;
#!/usr/bin/perl -w
-T
#!
Hattın tedavisi kullanılmaz $PATH
. Tercümanın yolunu belirtmelisiniz. (En azından sistemimde, bunun göreceli bir yol olabileceğini fark ettim, ancak bu nadiren yararlıdır.)
En iyi uygulama şudur:
#!/usr/bin/env bash
#!/usr/bin/env sh
#!/usr/bin/env python
Ve bunun gibi...
Ubuntu kısa çizgi kullanmaya başladığında bazı komut dosyaları bozuldu. Bu konuda bir tartışma vardı. Komut dosyalarının çoğu #!/bin/sh
/ bin / bash bağlantısı olan yazılmıştır . Fikir birliği şu şekildedir: senaryo yazarı tercümanı belirtmekten sorumludur. Bu nedenle, betiğinizin her zaman BASH ile çağrılması gerekiyorsa, ortamdan belirtin. Bu, çeşitli Unix / Linux sistemlerinde farklı olan yolu tahmin etmenizi sağlar. Buna ek olarak, yarın / bin / sh, / bin / wthsh veya başka bir saçmalık gibi başka bir kabuğa bağlantı haline gelirse çalışır.
#!/bin/bash
. Senaryo yazarının tercümanı belirtmekten sorumlu olduğunu kabul ediyorum, ancak bunun anlamı bash'a ihtiyacınız varsa, bash değil söyle
FYI bu bir saçmalık #!
, ihtiyacın var #
. Komut dosyasını hangi yorumlayıcıyla çalıştıracağınızı belirlemek için bu satırı kullanırsınız.
Varsayılan olarak, Ubuntu /bin/sh
kısa çizgiye bağlanır
Dash hakkında ne kadar bilmek istediğinize ve dash'in sistem veya deamon kabukları için neden kullanıldığına bağlı olarak aşağıdakilere bakın:
Bash, çoğu Linux kullanıcısı tarafından kullanılan varsayılan kabuktur ve kısa çizgiden sonra farklı özelliklere sahiptir. Bash için yazılan bir komut dosyası, tire ile çalıştırıldığında düzgün çalışabilir veya çalışmayabilir, komut dosyası ne kadar karmaşıksa, çalışma olasılığı da o kadar az olur.
Perl, python vb. İçin yazılmış komut dosyası /bin/sh
veya ile hiç çalışmaz /bin/bash
.
Yani bir senaryo yazarken, shee-bang ile hangi tercümanın kullanılması gerektiğini belirlersiniz
Ne kullanılacağını seçmek senaryo yazarı tarafından yapılır ve biri diğerinden daha iyi değildir, hepsinin çeşitli özellikleri, avantajları ve dezavantajları vardır.