! $ Ne anlama geliyor?


32

Bir öğretici üzerinden takip ediyorum ve bu komutu çalıştırmaktan bahsediyor:

sudo chmod 700 !$

Ben aşina değilim !$. Bunun anlamı ne?


5
Ne echoyapacağından emin değilseniz bir şeyi denemek genellikle güvenlidir .
Shadur

8
@Shadur, her zaman değil. echo $(rm -rf /)
cjm

1
@cjm Gerçekten eski bir sistemde değilseniz --no-preserve-root, oradaki seçeneğe ihtiyacınız olacak ve bir programda "korunmasız" kelimelerini görürseniz, ne yaptığı hakkında dikkatlice düşünmelisiniz.
wchargin

4
@WChargin "Gerçekten eski" ve "Linux değil / GNU coreutils kullanma" nın aynı şey olduğunu varsayırken çok dikkatli olun; onlar değil.
Chris Down

Yanıtlar:


44

Temel olarak, önceki komutun son argümanı.

!$önceki komutun "sonudur". Şu örneği inceleyin: Dosyadaki bir kelimeyi arayarak başlarız:

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

joe bu kullanıcı listesinde ise, onu listeden çıkarmak istiyoruz. Argüman olarak bu uzun dizin ağacıyla vi'yi ateşleyebiliriz, ya da vi !$hangi bash'ın genişlediği gibi:

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

( kaynak ; bu arada kullanışlı bir rehber)


Bu !$belirteç ile özel kabuk değişkeni arasındaki farkın bir değeri yoktur $_. Aslında, her ikisi de önceki komutun son argümanına genişler. Ancak, geçmiş!$ genişletme sırasında genişletilirken , parametre$_ genişletme sırasında genişletilir . Bunun önemli sonuçlarından biri !$, kullandığınızda genişletilmiş komutun geçmişinize kaydedilmiş olmasıdır.

Örneğin, tuş vuruşlarını düşünün.

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

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

(Değiştirilen tek karakterler $!ve $_ortasındadır.)

Birincisinde, tuşuna bastığınızda Up, komut satırı okur echo Foo Jar, bu nedenle stdout'a yazılan son satırdır Foo Jar.

İkincisinde, tuşuna bastığınızda Up, komut satırı okur echo $_ bar, ancak şimdi $_daha önce olduğundan farklı bir değere sahiptir - aslında, $_şimdi Jar, yani stdout'a yazılan son satır Jar Jar.

Diğer bir sonuç da, _örneğin komut dizisi gibi diğer parametre genişlemelerinde kullanılabilecek olmasıdır.

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

yazdırır isomorphism isosceles. Ancak benzer bir " ${!$%morphism}" genişleme yok.

Bash'deki genişlemenin evreleri hakkında daha fazla bilgi için, şu EXPANSIONbölüme bakın man 1 bash(buna çevrimiçi sürümde Kabuk Genişletmeleri adı verilir ). HISTORY EXPANSIONBölüm ayrıdır.


6
Güzel. Bilmek güzel. Ayrıca, iyi bir şey var Stack Exchange. Gibi bir şey için Google'da arama yapmak zor!$
Andrew

4
BTW, komut satırında, önceki komutun son argümanını insert-last-argumentgenellikle bağlanmış olarak ekleyebilirsiniz M-..
Choroba

1
@Andrew lütfen sorunuzu yanıtlarsa bunu kabul etmeyi unutmayın. Yorum göndermekten ziyade kabul etme ve değerlendirme, SE ağında teşekkürlerin ifade edilmesidir , "resmi" duruş için buraya bakınız .
terdon

1
@Andrew FYI, Google’ı "bash bang dollar" için aradım ve bu bağlantıyı üçüncü liste olarak da içeren iyi sonuçlar aldım.
wchargin

1
@ terdon Dün gece cevabı kabul etmeye çalıştım, ama kabul etmek için beklemek zorunda kaldım.
Andrew,

4

Açıkça konuşmak gerekirse !$, tarih listesindeki son komutun son sözcüğüdür.

kelime - Kabuk tarafından birim olarak kabul edilen bir karakter dizisi. Kelimeler, alıntılanmamış meta karakterleri içeremez.

metacharacter - Alıntılamadığında kelimeleri ayıran bir karakter. Bir meta karakter boş veya aşağıdaki karakterlerden biri: '|', '&', ';', '(', ')', '<' veya '>'

blank - Boşluk veya sekme karakteri.

Örnekler:

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


-3

!$ o belirli kullanıcı için kullanılan son komutu size verecek ....

Ayrıca daha önce kullanılan komutların geçmişini historykomutunu kullanarak da bulabilirsiniz ... deneyin ...

NOT: Belirli bir kullanıcı için, daha önce kullanılan tüm komutlar bash geçmiş dosyası altında saklanır.


1
Diğer cevaplar doğru. Bu yanlış.
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.