$ _ vs! $ Önceki komut ve çıktı yönlendirmesinin son argümanı


28

Soru özel değişkenlerle ilgilidir. Belgeler şöyle diyor:

!!:$

önceki komutun son argümanını belirler . Bu! $ İle kısaltılabilir.


( $_, bir alt çizgi.) Kabuk başlangıcında, ortam ya da argüman listesinde geçirildiği şekilde yürütülmekte olan kabuk ya da kabuk betiğini çağırmak için kullanılan mutlak yol adına ayarlayın. Daha sonra, genişletmeden sonra önceki komutun son argümanına genişler . Ayrıca, yürütülen her komutu çağırmak için kullanılan tam adı seçerek bu komuta verilen ortama yerleştirin.

Yakalayamadığım bir fark olmalı, çünkü:

$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt

$ echo "hello" > /tmp/a.txt
$ echo $_
hello

Fark ne?


4
! $, tarihin genişlemesidir, özel bir değişken değildir, bu yüzden bash kodunun onları farklı şekilde ele aldığını varsayıyorum.
Jeff Schaller

2
Bu soruya kesin bir cevabım yok, fakat: Bour Bourne kabuğu dili, bugün hala yaygın olarak kullanılan belki de en az dahili tutarlı programlama dilden bir tanesidir . Genel ilkeleri çıkarmaya çalışmak sizi hiçbir yere götürmez. Sadece tüm özel kuralları ezberlemelisin. Üzgünüm. Tanımda, vurguladığınız ifadenin hemen ardından "genişletmeden sonra" kelimelerini not edin $_. Bu çok önemli. Sizi şaşırtan farkı açıklamayabilir, ancak bir sürü başka yolu açıklar $_ve !$aynı değildir.
zwol

Yanıtlar:


32

!$tarih genişleme kelime designatörüdür, bu önceki komuta son kelimeye genişler tarihin . IOW, tarihteki önceki girişin son sözü. Bu kelime genellikle emir verilen son argümandır, ancak yönlendirme durumunda değildir. İçinde:

echo "hello" > /tmp/a.txt

Komutun tamamı 'echo "hello" > /tmp/a.txt'tarihte ortaya çıktı ve /tmp/a.txtbu komutun son sözü.

_bir kabuk parametresidir, önceki komutun son bağımsız değişkenine genişler. Burada, yeniden yönlendirme, komuta iletilen argümanların bir parçası değildir, bu nedenle yalnızca helloiletilen argümandır echo. Bu yüzden $_genişledi hello.

_artık standart özel parametrelerden biri değildir . O çalışır bash, zsh, mkshve dashsadece etkileşimli, ksh93sadece iki komut ayrı hatlarda olduğunda:

$ echo 1 && echo $_
1
/usr/bin/ksh

$ echo 1
1
$ echo $_
1

1
Bir etkisi !$vs genişleme $_parametresi olmasıdır echo $_olarak tarihe hep gösterileri echo $_sırasında, echo !$o kadar genişletildi gösterileri değeri o. Eg echo one twosonra echo !$, sonra basmak gösterir echo two.
Jacktose
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.