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.
(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.
echoyapacağından emin değilseniz bir şeyi denemek genellikle güvenlidir .