Apa artinya $ artinya?

32

Saya mengikuti tutorial dan menyebutkan untuk menjalankan perintah ini:

sudo chmod 700 !$

Saya tidak kenal !$. Apa artinya?

Andrew
sumber
5
Biasanya aman untuk mencoba echosesuatu jika Anda tidak yakin apa yang akan dilakukan.
Shadur
8
@ Safur, tidak selalu. echo $(rm -rf /)
cjm
1
@ cjm Kecuali Anda menggunakan sistem yang benar-benar tua, Anda akan memerlukan --no-preserve-rootopsi di sana, dan jika Anda melihat kata-kata "tidak ada pelestarian" dalam suatu program, Anda sebaiknya berpikir dengan hati-hati tentang apa yang dilakukannya.
wchargin
4
@WChargin Berhati-hatilah dengan menganggap bahwa "benar-benar tua" dan "bukan Linux / tidak menggunakan GNU coreutils" adalah hal yang sama; mereka tidak.
Chris Down

Jawaban:

44

Pada dasarnya, ini adalah argumen terakhir dari perintah sebelumnya.

!$adalah "akhir" dari perintah sebelumnya. Pertimbangkan contoh berikut: Kita mulai dengan mencari kata dalam file:

grep -i joe /some/long/directory/structure/user-lists/list-15

jika joe ada dalam daftar pengguna itu, kami ingin menghapusnya dari itu. Kita bisa menjalankan vi dengan pohon direktori panjang itu sebagai argumen, atau sesederhana vi !$bash mana yang diperluas menjadi:

vi /some/long/directory/structure/user-lists/list-15

( sumber ; panduan praktis, omong-omong)


Tidak ada bedanya dengan perbedaan antara !$token ini dan variabel shell khusus $_. Memang, keduanya memperluas argumen terakhir dari perintah sebelumnya. Namun, !$diperluas selama ekspansi riwayat , sementara $_diperluas selama ekspansi parameter . Salah satu konsekuensi penting dari ini adalah bahwa, ketika Anda menggunakan !$, perintah yang diperluas disimpan dalam riwayat Anda.

Misalnya, perhatikan penekanan tombol

  • echo Foo Enter echo !$ Jar Enter Up Enter; dan

  • echo Foo Enter echo $_ Jar Enter Up Enter.

(Satu-satunya karakter yang diubah adalah $!dan $_di tengah.)

Di yang pertama, ketika Anda menekan Up, baris perintah berbunyi echo Foo Jar, jadi baris terakhir yang ditulis untuk stdout adalah Foo Jar.

Pada yang terakhir, ketika Anda menekan Up, baris perintah berbunyi echo $_ bar, tetapi sekarang $_memiliki nilai yang berbeda dari yang sebelumnya — memang, $_sekarang Jar, jadi baris terakhir yang ditulis ke stdout adalah Jar Jar.

Konsekuensi lain adalah bahwa _dapat digunakan dalam ekspansi parameter lain, misalnya, urutan perintah

printf '%s '    isomorphism
printf '%s\n'   ${_%morphism}sceles

cetakan isomorphism isosceles. Tetapi tidak ada ${!$%morphism}ekspansi " " analog .

Untuk informasi lebih lanjut tentang fase ekspansi di Bash, lihat EXPANSIONbagian man 1 bash(ini disebut Shell Expansions dalam edisi online). The HISTORY EXPANSIONbagian terpisah.

wchargin
sumber
6
Bagus. Senang mendengarnya. Juga, untungnya ada Stack Exchange. Sulit untuk mencari di Google untuk sesuatu seperti!$
Andrew
4
BTW, pada baris perintah, Anda dapat menyisipkan argumen terakhir dari perintah sebelumnya dengan insert-last-argument, biasanya terikat M-..
choroba
1
@Andrew harap ingat untuk menerima ini jika itu menjawab pertanyaan Anda. Menerima dan meningkatkan daripada mengirim komentar adalah bagaimana terima kasih diungkapkan di jaringan SE, lihat di sini untuk sikap "resmi".
terdon
1
@Andrew FYI, saya mencari "bash bang dollar" di Google dan mendapatkan hasil yang layak, termasuk tautan ini sebagai daftar ketiga.
wchargin
1
@terdon saya mencoba menerima jawaban tadi malam, tetapi itu sangat cepat sehingga saya terpaksa menunggu untuk menerimanya.
Andrew
4

Sesungguhnya !$ , kata terakhir dari perintah terakhir dari daftar sejarah adalah kata terakhir.

kata - Urutan karakter yang diperlakukan sebagai satu unit oleh shell. Kata-kata tidak boleh menyertakan metakarakter yang tidak dikutip.

metacharacter - Karakter yang, ketika tidak dikutip, memisahkan kata. Metacharacter kosong atau salah satu dari karakter berikut: '|', '&', ';', '(', ')', '<', atau '>'

kosong - Karakter spasi atau tab.

Contoh:

set -o history # enable command history
set -o histexpand # enable ! style history substitution

HISTSIZE=10

# save all lines on the history list    
HISTCONTROL=
HISTIGNORE=

date
echo !$ # prints date

date>/dev/null
echo !$ # prints /dev/null

echo a b c>/dev/null
echo !$ # prints /dev/null

HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list
echo a b c
 echo d e f # space at the beginning
echo !$ # prints c
Evgeny Vereshchagin
sumber
-3

!$ akan memberi Anda perintah terakhir yang digunakan untuk pengguna tertentu ....

Anda juga dapat menemukan riwayat perintah yang digunakan sebelumnya dengan menggunakan historyperintah ... coba saja ....

CATATAN: Untuk pengguna tertentu, semua perintah yang digunakan sebelumnya akan disimpan dalam file bash history.

karthik G
sumber
1
Jawaban lainnya benar. Yang ini salah.
Scott