Bash içindeki son dönüş değerine nasıl erişilir?


69

Basit senaryo: wsdlBir projenin ortasında kaybolan bir dosyayı arıyorum .

$ find -name '*.wsdl'
./some/very/very/long/way/to/some/lost/directory/filename.wsdl

Şimdi nerede olduğunu bildiğime göre, bu dosyayla bir şeyler yapmak istiyorum. Komutun arkasındaki yolu kopyalamak / yapıştırmak yerine, finddaha önce döndürülen yolu kullanmak mümkün müdür ? Aynen yazdığın son argümana !$veya en son komutuna ulaşman gibi !!.
Bunun mümkün olduğunu okudum $?, ancak yalnızca bana bir hata veriyor:0: command not found

$ echo $?
0: command not found

3
Bu dönüş değeri değil, çıktı!
MirandaVeracruzDeLaHoyaCardina

Ayrıntılı olarak "dönüş değeri" her zaman bir sayıdır. Genellikle 0 başarı, sıfır olmayan ise bir tür başarısızlık anlamına gelir. Komutun yaydığı dize (veya metin) "dönüş değeri" değil, "çıkışı" olarak adlandırılır.
Michael Dorst

Yanıtlar:


33

Komutu yerine komut komutu çalıştırın:

output=$( find -name '*.wsdl' )
echo "$output"

Çıktı şimdi outputistediğiniz kadar kullanabileceğiniz değişkende saklanır .


11
Bu doğru bir cevap değil. , $? dır-dir.
mcmlxxxiii 11:16

@mcmlxxxiii: $?yolları içermiyor.
choroba

1
Özür dilerim, returnsorudaki terimin kötüye kullanılmasıyla kafam karıştı . Cevabınız yukarıdaki soru için kesinlikle doğrudur.
mcmlxxxiii

4
$?son komutun çıkış durumunu içerir
Brett Wagner

Bu cevap oldu ben arıyordum. Önceki komutun çıktısı, başarı / başarısızlık dönüş değeri ile ilgilenmiyorum. Çok teşekkür ederim!
Joshua Pinter

74

Bunun için özel bir bash değişkeni yoktur.

$? Son komutun çıkış kodunu içerir (0 = başarı,> 0 = hata kodu)

Sen çıktısını kullanabilirsiniz findile -execböyle bayrak,:

 find -name  '*.wsdl' -exec emacs {} \;

{}Tarafından bulunan dosya adıyla değiştirilir find. Bu, bulunan her dosya için komutu yürütür. Bulunan tüm dosyalarda bir komut çalıştırmak istiyorsanız, argümanlar +gibi bir uç kullanın :

  find -name '*.wsdl' -exec emacs {} +

Bu, içinde bulunan tüm .wsdl dosyalarının bulunduğu bir emacs örneğini açar.

Daha genel bir çözüm, çıktıyı bir değişkende saklamaktır:

result=$(find -name '*.wsdl')
emacs $result

Bu sadece bulmakla değil, tüm komutlarla çalışır. Yine de kullanabilirsiniz xargs:

  find -name '*.wsdl' | xargs emacs {}

$?Başka bir komutun çıkış kodunu döndürmek mümkün mü ? örneğin sayfa 1.1.1.1 -10; $ döndür
Mart’ta

1
$?ne olursa olsun, önceki komutun çıkış kodunu içerir. Yani cevabı evet.
ahilsend

43

İşte, son komutun iki kez çalıştırılmasının sakıncası yoksa, minimum tuş vuruşlarıyla istediğiniz şeyi yapması gereken hızlı bir saldırı.

Backtick, ala kullanın:

`!!`

Örneğin

$ bul. -Ad HardToFind.txt
Bazı / deli / / yol / HardToFind.txt
$ vim `!!

* düzenleme: Yukarıda verilen "muhtemelen duped" sorusunun da bu cevabı içerdiğini görüyorum. hala bununla doğrudan ilgili, bu yüzden bırakarak, ama dupe için üzgünüm.


2
Çok zeki. Bence bu, zaten emri yerine getirene kadar çıktıya ihtiyaç duymadığınızı bilmemenin en yaygın vakasını çözdüğü için kabul edilen cevap olmalıdır.
Paul Ruane

1
Kabul ediyorum, buraya aramaya geldim. Önceki satırda bir şey yapmak amacımı yendi, geriye dönük olarak son döndürülen değeri olan bir şey yapmak istediğime karar vermek. ( git br | grepBenim
Jack Casey, 0

Benim favorilerimden biri, bu! Bunu günlük olarak yaptığımı düşünüyorum.
MetalGodwin 28:16

Bence bunu yapabilmenin çok zekice, ama ne kadar faydalı olduğundan emin değilsin. Yazmak !!, yukarı tuşa basmaktan daha mı kolay? Ve sonra emrinizi hala görebilirsiniz. Komutu tekrar çalıştırmak kabul edilebilirse, bence sadece basmak kadar kolay (ve biraz daha anlaşılabilir ve şeffaf),
Svend Hesselholt Henne Hansen 14:17
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.