Mengapa tidak mengekspor variabel pada baris yang sama dengan yang Anda tetapkan?


44

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?




9
Aturan shellcheck yang dimaksud adalah SC2155. Ada dokumentasi yang cukup bagus di wiki shellcheck .
phunehehe

3
Juga beberapa shell yang lebih tua tidak akan menerima exportdan tugas bersama. The Heirloom Bourne Shell , misalnya, output "foo = 2 bukan merupakan identifier" kesalahan.
Dennis Williamson

Jawaban:


54

The masalah adalah bahwa dalam Bash setiap perintah hanya memiliki satu kode keluar. Ketika Anda export foo="$(false)"kode keluar falsehanya dibuang. Jika Anda melakukannya

foo="$(false)"
export foo

perintah pertama yang gagal dapat ditindaklanjuti, misalnya dengan errexitpengaturan.

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)". Lihat pipefaildi man bashuntuk 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


Jadi jika seseorang mengatur variabel dari literal, dan tidak ada kode keluar untuk dibuang, tidak ada yang salah dengan melakukan semuanya pada satu baris.
Monty Harder

1
Sejauh menyangkut kesalahan shellcheck ini, tidak. Tetapi karena jawaban yang dihapus sekarang menjadi setengah benar di antara mereka, cangkang Bourne tidak mendukung sintaks penugasan untuk export, jadi untuk beberapa tahun ada menerima kebijaksanaan tentang melakukan ini jika penerjemah seseorang kemungkinan menjadi cangkang Bourne.
JdeBP

@ JdeBP, perhatikan bahwa shell Bourne memang mendukung foo=$(cmd) export foo, meskipun dengan peringatan yang sama bahwa cmdstatus keluar hilang (tetapi memang menyebabkan shell untuk keluar jika gagal dengan set -e).
Stéphane Chazelas

Itu tercakup oleh kalimat pertama saya.
JdeBP
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.