Pertanyaannya adalah tentang variabel khusus. Dokumentasi mengatakan:
!!:$
menunjuk argumen terakhir dari perintah sebelumnya . Ini mungkin
disingkat menjadi!$
.
(
$_
, sebuah garis bawah.) Saat memulai shell, setel ke nama path absolut yang digunakan untuk menjalankan skrip shell atau shell yang dieksekusi seperti yang diteruskan di lingkungan
atau daftar argumen. Selanjutnya, diperluas ke argumen terakhir ke perintah sebelumnya setelah ekspansi. Juga disetel ke nama path lengkap yang digunakan untuk memanggil setiap perintah yang dijalankan dan ditempatkan di lingkungan
yang diekspor ke perintah itu.
Pasti ada perbedaan yang tidak bisa saya tangkap, karena:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
Apa bedanya?
Jawaban yang Diterima:
!$
adalah penanda kata dari perluasan histori, yang diperluas ke kata terakhir dari perintah sebelumnya di sejarah . TKI, kata terakhir dari entri sebelumnya dalam sejarah. Kata ini biasanya merupakan argumen terakhir untuk perintah, tetapi tidak dalam hal pengalihan. Dalam:
echo "hello" > /tmp/a.txt
seluruh perintah 'echo "hello" > /tmp/a.txt'
muncul di riwayat, dan /tmp/a.txt
adalah kata terakhir dari perintah itu.
_
adalah parameter Shell, itu diperluas ke argumen terakhir dari perintah sebelumnya. Di sini, pengalihan bukan bagian dari argumen yang diteruskan ke perintah, jadi hanya hello
adalah argumen yang diteruskan ke echo
. Itu sebabnya $_
diperluas menjadi hello
.
_
bukan lagi salah satu parameter khusus standar shell. Ini berfungsi di bash
, zsh
, mksh
dan dash
hanya jika interaktif, ksh93
hanya ketika dua perintah berada pada baris yang terpisah:
$ echo 1 && echo $_
1
/usr/bin/ksh
$ echo 1
1
$ echo $_
1