Ne tür bir yol daha tercih edilir?


20

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:


22

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 $PATHkullanın #!/usr/bin/env ....

envKomut 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

interpiç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/binya da /usr/local/bin). Tabii ki bunu biliyor zorunda envolduğ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 perlolarak, benim ev dizin altında $HOME/bin/perlve ben $HOME/binSesimin önünde $PATH. Mesleği olan bir senaryo çalıştırırsam

#!/usr/bin/env perl

kendi yüklü perlyü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/perlve /bin/bashsı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 .


Az önce Ruby'e bakmaya başladım ve Ruby'deki sözleşmenin taşınabilirlik uğruna [kod] #! / Usr / bin / env ruby ​​[/ code] ile başlamak olduğunu gördüm. Bazıları bunun perl için bir sorun olabilecek '-w' gibi yakut yorumlayıcıya komut satırı argümanları sunmayı zorlaştırdığını belirtti.
bgvaughan

@bgvaughan Perl için, bugünlerde betiğin gövdesinde kullanmak #!/usr/bin/perlve sonra kullanmak gelenekseldir . Ama mesele üzerinde olmalı. use strict; use warnings;#!/usr/bin/perl -w-T
Keith Thompson

öyleyse neden sadece ilk yolu istiyorsak #! perl kullanmıyorsunuz?
wheredidthatnamecome5

@wheredidthatnamecomefrom: Çünkü bu işe yaramıyor. #!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.)
Keith Thompson

6

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.


Kısa çizgi sorunu için bariz alternatif düzeltme yazmaktı #!/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
Martin Bonner Monica

1

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/shkı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:

cyberciti.biz çizgi

Ubuntu tire man sayfası

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/shveya 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.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.