Saya punya beberapa skrip bash yang saya set up yang kebanyakan digunakan
#!/bin/bash
tapi saya secara teratur menemukan beberapa yang terlihat seperti
#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex
dan seterusnya.
Bisakah seseorang menjelaskan arti dan manfaat dari opsi shebang ini dan apakah itu berlaku untuk shebang lain?
Jawaban:
Jika skrip
/path/to/foo
dimulai dengan#!/bin/bash
, maka mengeksekusi/path/to/foo arg1 arg2
sama dengan mengeksekusi/bin/bash /path/too/foo arg1 arg2
. Jika garis shebang adalah#!/bin/bash -ex
, itu setara dengan mengeksekusi/bin/bash -ex /path/too/foo arg1 arg2
. Fitur ini dikelola oleh kernel.Perhatikan bahwa Anda hanya dapat memiliki satu argumen pada baris shebang: beberapa unit (seperti Linux) hanya menerima satu argumen, sehingga
#!/bin/bash -e -x
akan menyebabkan bash menerima argumen lima karakter tunggal-e -x
(kesalahan sintaks) daripada dua argumen-e
dan-x
.Untuk cangkang Bourne
sh
dan cangkang turunan seperti POSIX sh, bash, ksh, dan zsh:-e
berarti bahwa jika ada perintah gagal (yang ditunjukkan dengan mengembalikan status bukan nol), skrip akan segera berakhir.-x
menyebabkan shell untuk mencetak jejak eksekusi.Program lain mungkin memahami opsi ini tetapi dengan makna berbeda.
sumber
Mereka adalah opsi yang dilewatkan untuk
bash
melihathelp set
info lebih lanjut, dalam hal ini:sumber
-ex
melakukan keduanyaman 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: [...]
.Saya hanya ingin menyebutkan alternatif yang lebih baik - seperti pada yang lebih portabel -:
Contoh di atas digunakan
env
untuk menemukanbash
executable, yang tidak selalu di/bin/bash
. Ye Olde#!/bin/bash
script tidak bekerja pada NixOS , misalnya.Jika Anda menggunakan
env
seperti yang ditunjukkan di atas, Anda tidak dapat menyediakan argumen seperti-e
untukbash
(sejauh yang saya tahu). Tetapi Anda dapat melakukan ini sebagai gantinya:sumber
env
penggunaannya tidak baik terutama untuk skrip yang menjalankan python karena Anda tidak tahu apakah defaultnyapython
adalah versi 2 atau 3 dan itu membuat perbedaan dunia untuk skrip yang membutuhkan versi tertentu. Lebih baik untuk menjadi eksplisit daripada licik