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.
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
VAR=value; somecommand
setara denganIni adalah perintah yang tidak berhubungan yang dieksekusi satu demi satu. Perintah pertama memberikan nilai ke variabel shell
VAR
. KecualiVAR
sudah menjadi variabel lingkungan, itu tidak diekspor ke lingkungan, itu tetap internal ke shell. Sebuah pernyataanexport VAR
akan dieksporVAR
ke lingkungan.VAR=value somecommand
adalah sintaks yang berbeda. PenugasanVAR=value
itu untuk lingkungan, tetapi penugasan ini hanya dibuat di lingkungan eksekusisomecommand
, bukan untuk eksekusi shell selanjutnya.Sebagai contoh:
sumber