Bila Anda menggunakan LANG=C gcc ... apa yang terjadi adalah bahwa shell menetapkan LANG untuk gcclingkungan 's hanya , dan tidak untuk saat ini lingkungan itu sendiri ( lihat catatan ). Jadi setelah gccselesai, LANGkembali ke nilai sebelumnya (atau tidak disetel).
Selain itu, ketika Anda menggunakannya A=10 echo $Aadalah shell yang menggantikan $ A, bukan echo, dan substitusi ini (disebut "ekspansi") terjadi sebelum pernyataan dievaluasi (termasuk penugasan), sehingga untuk bekerja sesuai Adengan nilai yang diharapkan , nilai harus sudah ditetapkan. di lingkungan saat ini sebelum pernyataan itu.
Itu sebabnya A=10 echo $Atidak berfungsi seperti yang diharapkan: A=10akan ditetapkan untuk gema, tetapi gema secara internal mengabaikan nilai variabel lingkungan A. Dan $Adiganti dengan nilai yang ditetapkan di shell saat ini (yang tidak ada), dan kemudian diteruskan sebagai argumen untuk echo.
Jadi asumsi Anda benar: VAR=value command tidak berfungsi, tetapi ini hanya relevan jika secara commandinternal menggunakan VAR. Jika tidak, Anda masih dapat melewati valuesebagai argumen untuk command, tetapi argumen digantikan oleh arus shell, sehingga mereka harus ditetapkan sebelum penggunaan:VAR=value; command "$VAR"
Jika Anda tahu cara membuat skrip yang dapat dieksekusi, Anda dapat mencoba ini sebagai ujian:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
Simpan sebagai testscriptdan coba:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
Terakhir namun tidak kalah pentingnya, ada baiknya mengetahui perbedaan antara variabel shell dan lingkungan dan argumen program .
Berikut ini beberapa referensi bagus:
.
(*) Catatan: teknis shell tidak diatur dalam lingkungan saat ini juga, dan inilah sebabnya: Beberapa perintah, seperti echo, readdan testyang builtin shell , dan dengan demikian mereka tidak menelurkan sebuah proses anak. Mereka berjalan di lingkungan saat ini. Tetapi shell menangani tugas hanya berlangsung sampai perintah berjalan, jadi untuk semua tujuan praktis efeknya sama: tugas hanya dilihat oleh perintah tunggal.
A=10 (echo $A)dan dapatkan10?