Setelah saya menjalankan set -a var=99
, saya dapat menemukan kalimat dalam output dari set
:
...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...
Adakah yang bisa memberi tahu saya apa artinya "_ ="?
Saya perhatikan bahwa tidak echo $var
akan memberikan apa-apa. Jika saya menjalankan set -a
, maka set
tidak akan menyertakan variabel ini lagi. Apa yang terjadi?
Jawaban:
Ketika Anda mengeksekusi
set -a var=99
, tiga hal berbeda terjadi (terkait dengan pertanyaan Anda):-a
) (terbalik dengan melakukanset +a
) untuk mengekspor vars.$1
set kevar=99
).$_
diatur ke parameter terakhir (diperluas).set -a
Eksekusi
set -a
menandai semua variabel berikutnya (baru atau diubah) yang diekspor (dalam semua shell, kecualicsh
dan beberapa shell terkait).Untuk memulihkan dari pengaturan ini, cukup ubah
-
ke+
:set var = 99
Yang sebenarnya harus
set -- var=99
menghindari interpretasi opsi (dan set memiliki banyak) dengan nilai-nilai yang dimulai dengan tanda hubung (-
).Atur daftar argumen (daftar parameter posisi) ke yang setelah
--
. Itu berlaku di semua shell yang masuk akal (tidak dalam csh et al). Argumen posisional dicetak dengan "$ @" (atau "$ *" yang serupa, tidak sama)._ = last_argument
Dan, nilai variabel shell internal
_
berubah menjadi argumen terakhir dari baris yang dieksekusi. Itu TIDAK benar di hampir semua shell (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh dan tentu saja csh dan tcsh) kecuali bash.Harap perhatikan bahwa nilai dalam
$_
adalah nilai setelah ekspansi:Itu sebabnya ketika Anda mengeksekusi:
Anda mendapatkan deskripsi variabel shell '$ _'. Ini juga berfungsi:
sumber
Garis bawah sebenarnya adalah variabel shell khusus. Apa yang Anda lihat di sini adalah
_
variabel garis bawah ( ) dengan nilaivar=99
. Itu dibaca hanya, dan dikelola oleh shell. Ini:Contoh Anda termasuk dalam kategori kedua. Anda mengetik:
Jadi argumen terakhir ada
var=99
, dan itu adalah nilai yang Anda tetapkan (Anda tidak menyetelvar
ke99
). Oleh karena itu,_
diatur untuk itu. Dan itulah yang dilaporkan:Agak membingungkan, tetapi yang pertama
=
menunjukkan tugas untuk variabel_
, dan yang kedua adalah bagian dari nilai.Perlu juga disebutkan bahwa
-a
opsi untukset
akan menyebabkan semua variabel yang didefinisikan selanjutnya diekspor.sumber
Jawaban yang tepat akan tergantung pada shell yang Anda gunakan:
bash
, apa pun yang dikatakan @BobEager berlakuzsh
, hanya disetel ke argumen terakhir dari perintah sebelumnya, dan ke pathname lengkap dari perintah di lingkungan perintahdash
hanya mengatur variabel ini saat menjalankan sesi interaktifMungkin ada kekhasan lain dalam cangkang lain juga. Dengan demikian,
$_
ini tidak didefinisikan dalam POSIX, sehingga salah satu harus menyadari masalah portabilitas potensial ketika menggunakannya.Catatan tambahan: jika maksud Anda adalah untuk menetapkan nilai 99 ke
var
dan membuatnya tersedia di lingkungan subproses berikutnya, sintaks yang benar untuk mencapai ini adalah:sumber
unset var;set -a; var=99
. Bekerja di semua cangkang resonable (bukan csh et al).Dalam cetakan bash (1) yang tidak terlalu bagus , kami temukan
Yang berarti,
set -a var=99
tidak mengatur variabel lingkunganvar
ke99
; set$1
kevar=99
. Cobaecho "$1"
atauecho "$*"
dan Anda akan melihat.sumber