Pertanyaannya adalah tentang variabel khusus. Dokumentasi mengatakan:
!!:$
menunjuk argumen terakhir dari perintah sebelumnya . Ini dapat disingkat menjadi $!
(
$_
, garis bawah.) Pada startup shell, setel ke pathname absolut yang digunakan untuk memanggil shell atau skrip shell yang dieksekusi seperti yang diteruskan dalam lingkungan atau daftar argumen. Selanjutnya, perluas argumen terakhir ke perintah sebelumnya setelah ekspansi. Juga setel ke nama path lengkap yang digunakan untuk memanggil setiap perintah yang dieksekusi dan ditempatkan di lingkungan yang diekspor ke perintah itu.
Pasti ada beberapa 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?
bash
shell
history-expansion
Mesin tenun
sumber
sumber
$_
. Itu krusial. Mungkin tidak menjelaskan perbedaan yang membingungkan Anda, tetapi itu menjelaskan banyak cara lain$_
dan!$
tidak sama.Jawaban:
!$
adalah penunjuk kata perluasan sejarah, kata ini meluas ke kata terakhir dari perintah sebelumnya dalam sejarah . TKI, kata terakhir dari entri sebelumnya dalam sejarah. Kata ini biasanya argumen terakhir untuk perintah, tetapi tidak dalam kasus pengalihan. Di:seluruh perintah
'echo "hello" > /tmp/a.txt'
muncul dalam sejarah, dan/tmp/a.txt
merupakan kata terakhir dari perintah itu._
adalah parameter shell, itu memperluas argumen terakhir dari perintah sebelumnya. Di sini, pengalihan bukan merupakan bagian dari argumen yang diteruskan ke perintah, jadi hanyahello
argumen yang diteruskan keecho
. Itu sebabnya$_
diperluas kehello
._
bukan salah satu dari parameter khusus standar shell lagi. Ia bekerja dibash
,zsh
,mksh
dandash
hanya ketika interaktif,ksh93
hanya ketika dua perintah berada di garis terpisah:sumber
!$
ekspansi vs$_
parameter adalah yangecho $_
selalu ditampilkan dalam riwayat sebagaiecho $_
, sementaraecho !$
menunjukkan nilai yang diperluas. Misalnyaecho one two
kemudianecho !$
, kemudian menekan up showecho two
.