Kapan menggunakan titik koma antara variabel lingkungan dan perintah

14

Adakah yang bisa menjelaskan mengapa titik koma diperlukan agar LANGdapat dilihat sebagai diperbarui oleh bash?

Tidak bekerja:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

Bekerja:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

Saya bekerja dengan bash 4.1.10 di linux dan versi yang sama di bawah cygwin

Richard Corden
sumber

Jawaban:

23

Parameter dan jenis ekspansi lainnya dilakukan ketika perintah dibaca, sebelum dieksekusi.

Versi pertama LANG=Ja_JP bash -c "echo $LANG",, adalah satu perintah. Setelah diuraikan seperti itu, $LANGdiperluas ke en_USsebelum sesuatu dieksekusi. Setelah bashselesai memproses input, maka akan melakukan proses, menambah LANG=Ja_JPlingkungan seperti yang diharapkan, dan kemudian mengeksekusi bash -c echo en_US.

Anda dapat mencegah ekspansi dengan tanda kutip tunggal, yaitu LANG=Ja_JP bash -c 'echo $LANG'keluaran Ja_JP.

Perhatikan bahwa ketika Anda memiliki tugas variabel sebagai bagian dari perintah, tugas tersebut hanya mempengaruhi lingkungan perintah itu dan bukan lingkungan shell Anda.

Versi kedua, LANG=Ja_JP; bash -c "echo $LANG"sebenarnya adalah dua perintah terpisah yang dijalankan secara berurutan. Yang pertama adalah penugasan variabel sederhana tanpa perintah, sehingga memengaruhi shell Anda saat ini.

Dengan demikian, kedua cuplikan Anda pada dasarnya berbeda meskipun ada perbedaan dangkal dari satu ;.

Benar-benar di luar topik, tetapi mungkin saya sarankan menambahkan .UTF-8pengaturan saat LANG. Tidak ada alasan bagus saat ini untuk tidak menggunakan Unicode di abad ke-21.

jw013
sumber
Jawaban yang bagus - terima kasih! Mengenai penambahan UTF-8. Saya mencoba menguji penanganan lokal aplikasi yang perlu bekerja pada beberapa platform beberapa di antaranya sudah cukup tua. Antara perbedaan seperti ini (yang untungnya sudah Anda jelaskan) dan perbedaan di linux dan cygwin, saya akan melempar diri ke bawah bus!
Richard Corden
5

VAR=value; somecommand setara dengan

VAR=value
somecommand

Ini adalah perintah yang tidak berhubungan yang dieksekusi satu demi satu. Perintah pertama memberikan nilai ke variabel shell VAR. Kecuali VARsudah menjadi variabel lingkungan, itu tidak diekspor ke lingkungan, itu tetap internal ke shell. Sebuah pernyataan export VARakan diekspor VARke lingkungan.

VAR=value somecommandadalah sintaks yang berbeda. Penugasan VAR=valueitu untuk lingkungan, tetapi penugasan ini hanya dibuat di lingkungan eksekusi somecommand, bukan untuk eksekusi shell selanjutnya.

Sebagai contoh:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya tidak benar-benar memikirkan perbedaan antara variabel shell vs lingkungan. Saya harus pergi melakukan riset. Terima kasih atas jawabannya.
Richard Corden