Dari Apa argumen terakhir dari perintah sebelumnya?
shellcheck memberi tahu Anda untuk tidak mengekspor variabel pada baris yang sama dengan yang Anda tetapkan.
Saya bertanya-tanya mengapa?
Apakah nasihat yang sama berlaku untuk alias
, declare
, export
, local
, readonly
, dan typeset
?
export
dan tugas bersama. The Heirloom Bourne Shell , misalnya, output "foo = 2 bukan merupakan identifier" kesalahan.Jawaban:
The masalah adalah bahwa dalam Bash setiap perintah hanya memiliki satu kode keluar. Ketika Anda
export foo="$(false)"
kode keluarfalse
hanya dibuang. Jika Anda melakukannyaperintah pertama yang gagal dapat ditindaklanjuti, misalnya dengan
errexit
pengaturan.Mendeklarasikan dan menetapkan string literal seperti
export foo='bar'
tentu saja tidak menderita masalah ini. Tetapi perubahan adalah satu-satunya yang konstan dalam pengembangan perangkat lunak, dan ini adalah pemeliharaan yang baik untuk pernyataan di masa depan dengan memisahkannya.Selain perintah khusus tugas yang Anda sebutkan, ada juga beberapa perintah dalam satu tugas seperti
foo="$(false)$(true)"
. Lihatpipefail
diman bash
untuk lain perangkap tersebut.Hal lain yang perlu diingat adalah bahwa urutan deklarasi dan penugasan terkadang relevan. Misalnya, Anda ingin mendeklarasikan variabel sebelum menetapkannya. (Sayangnya tidak mungkin untuk mendeklarasikan variabel sebelum menetapkannya untuk pertama kalinya.)
local
readonly
sumber
export
, jadi untuk beberapa tahun ada menerima kebijaksanaan tentang melakukan ini jika penerjemah seseorang kemungkinan menjadi cangkang Bourne.foo=$(cmd) export foo
, meskipun dengan peringatan yang sama bahwacmd
status keluar hilang (tetapi memang menyebabkan shell untuk keluar jika gagal denganset -e
).