Aptallar için Bash Shebang?


36

Çoğu bash komut dosyası kullanıyorum

#!/bin/bash

ama düzenli olarak bazılarına benziyorum

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

ve bunun gibi.

Birisi bu shebang seçeneklerinin anlamını ve faydalarını ve diğer shebang'lara uygulanıp uygulanmadığını açıklayabilir mi?


Bu seçenekler Bash'e (veya diğer tercümana) özgüdür. Diğer mermiler için aynı olabilirler (örneğin çizgi ve ksh), ancak AWK ve Python gibi diğer tercümanlar için farklı olabilirler. Tercümanın kabul ettiği seçeneklerin çoğunu kullanabilirsiniz. Seçenekler, tercümana özelken, shebang bir çekirdek özelliğidir.
sonraki duyuruya kadar duraklatıldı.

Yanıtlar:


41

Bir betik /path/to/fooile başlarsa #!/bin/bash, yürütme yürütmeye /path/to/foo arg1 arg2eşdeğerdir /bin/bash /path/too/foo arg1 arg2. Shebang hattı ise #!/bin/bash -ex, çalıştırmaya eşdeğerdir /bin/bash -ex /path/too/foo arg1 arg2. Bu özellik çekirdek tarafından yönetilir.

(Linux gibi) bazı Unix sistemleri, böylece sadece bir argüman kabul ediyoruz: Eğer portably shebang satırda sadece bir argüman sahip olabileceği Not #!/bin/bash -e -xtek beş karakterlik argüman alan bash yol açacak -e -x(sözdizimi hatası) yerine iki argüman -eve -x.

Bourne kabuğu shve POSIX sh, bash, ksh ve zsh gibi türetilmiş kabuklar için:

  • -e herhangi bir komutun başarısız olması durumunda (sıfır olmayan bir durum döndürerek gösterir), komut dosyasının derhal sonlandırılacağı anlamına gelir.
  • -x kabuğun bir yürütme izi yazdırmasına neden olur.

Diğer programlar bu seçenekleri anlayabilir ancak farklı anlamlara gelebilir.


24

Bu durumda, daha fazla bilgi bashedinmek help setiçin geçirilen seçeneklerdir :

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.

3
+1 Ve -exikisini de yapıyor
Nifle

Kafa karıştırıcı çünkü Bash'e aktarılan komut satırı seçenekleri gibi görünüyorlar.
Caoilte 19:12

2
@Caoilte: Ve gerçekten onlar (vardır man bash): In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...].
cYrus 19:12

1
arrgh! göz açıp kapayıncaya kadar özlediniz! :).
Caoilte 19:12

0

Daha da iyisinden bahsetmek istiyorum - daha taşınabilirde olduğu gibi - alternatif:

#!/usr/bin/env bash

Yukarıdaki örnek , her zaman bulunmayan yürütülebilir dosyayı envbulmak için kullanır . Örneğin siz senaryolar NixOS üzerinde çalışmıyor .bash/bin/bash#!/bin/bash

Eğer kullanırsanız envyukarıda gösterildiği gibi, sen gibi bir argüman temin edemez -eiçin bash(aynı bildiğim kadarıyla). Ancak bunun yerine bunu yapabilirsiniz:

#!/usr/bin/env bash
set -e

2
Bunu her zaman yapıyorum, ancak bunun “daha ​​taşınabilir” olduğunu söyleyemem - aslında, kullanıcının tamamen farklı bir şey çalıştırma riski (bir sistemin birlikte gönderdiğini düşündüğünüzden) çok daha büyüktür. Örneğin, Ubuntu hala Bash 4'ü gönderirken, bir kullanıcı Bash 5'i çalıştırmayı seçebilir.
slhck

Evet, envözellikle python çalıştıran betikler için kullanım iyi değildir, çünkü varsayılanın pythonsürüm 2 veya 3 olup olmadığını ve bu, belirli bir sürüme ihtiyaç duyan betikler için fark yaratan bir dünya yaratır.
Crafty'den
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.