Bagaimana cara mengakses nilai pengembalian terakhir di bash?

69

Skenario sederhana: Saya mencari wsdlfile yang hilang di tengah proyek.

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

Sekarang saya tahu di mana itu, saya ingin melakukan sesuatu dengan file ini, katakan sunting. Alih-alih menyalin / menempel jalur di belakang perintah saya, apakah mungkin untuk menggunakan jalur yang dikembalikan findsebelumnya? Sama seperti itu mungkin untuk mengakses argumen terakhir yang Anda ketikkan !$atau Anda perintah terakhir dengan !!.
Saya telah membaca bahwa itu mungkin terjadi $?, tetapi itu hanya mengembalikan saya kesalahan:0: command not found

$ echo $?
0: command not found
Anto
sumber
3
Ini bukan nilai balik, ini adalah output!
MirandaVeracruzDeLaHoyaCardina
Singkatnya, "nilai pengembalian" selalu berupa angka. Biasanya 0 berarti sukses, dan bukan nol berarti semacam kegagalan. String (atau teks) yang dimuntahkan perintah disebut sebagai "output", bukan "nilai pengembalian".
Michael Dorst

Jawaban:

33

Jalankan perintah di substitusi perintah:

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

Output sekarang disimpan dalam outputvariabel yang dapat Anda gunakan sebanyak yang Anda suka.

choroba
sumber
11
Ini bukan jawaban yang benar. $? aku s.
mcmlxxxiii
@mcmlxxxiii: $?tidak mengandung path.
choroba
1
Permintaan maaf saya, saya bingung dengan penyalahgunaan istilah returndalam pertanyaan. Jawaban Anda benar untuk pertanyaan di atas.
mcmlxxxiii
4
$?berisi status keluar dari perintah terakhir
Brett Wagner
Ini adalah jawaban yang saya cari. Saya tertarik pada output dari perintah sebelumnya bukan nilai pengembalian sukses / gagal. Jadi terima kasih
Joshua Pinter
74

Tidak ada variabel bash khusus untuk itu.

$? berisi kode keluar dari perintah terakhir (0 = sukses,> 0 = kode kesalahan)

Anda dapat menggunakan output finddengan -execflag, seperti ini:

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

The {}diganti dengan nama file ditemukan oleh find. Ini akan menjalankan perintah untuk setiap file yang ditemukan. Jika Anda ingin menjalankan perintah dengan semua file yang ditemukan sebagai argumen gunakan +pada akhir seperti ini:

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

Ini akan membuka satu instance emacs dengan semua file .wsdl yang ditemukan dibuka di dalamnya.

Solusi yang lebih umum adalah menyimpan output dalam variabel:

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

Ini bekerja dengan semua perintah, bukan hanya menemukan. Meskipun Anda mungkin juga menggunakan xargs:

  find -name '*.wsdl' | xargs emacs {}
ahilsend
sumber
Apakah mungkin $?untuk mengembalikan kode keluar dari perintah lain? mis. ping 1.1.1.1 -w 10; mengembalikan $?
twnaing
1
$?berisi kode keluar dari perintah sebelumnya, apa pun itu. Jadi jawabannya adalah ya.
ahilsend
43

Berikut ini hack cepat yang harus melakukan apa yang Anda inginkan dengan penekanan tombol minimal, jika Anda tidak keberatan bahwa perintah terakhir dijalankan dua kali.

Gunakan backtick, ala:

`!!`

misalnya

$ temukan. -nama HardToFind.txt
beberapa / crazy / path / ke / HardToFind.txt
$ vim `!!`

* sunting: Saya melihat pertanyaan "mungkin ditipu" di atas juga berisi jawaban ini. masih relevan langsung dengan yang satu ini, jadi tinggalkan saja, tapi maaf untuk korban penipuan.

rampok
sumber
2
Sangat pintar. Saya pikir ini harus menjadi jawaban yang diterima karena memecahkan kasus yang paling umum tidak mengetahui Anda membutuhkan output sampai Anda sudah menjalankan perintah.
Paul Ruane
1
Saya setuju, inilah yang saya cari di sini. Melakukan sesuatu pada baris sebelumnya mengalahkan tujuan saya, untuk secara surut memutuskan saya ingin melakukan sesuatu dengan nilai yang dikembalikan terakhir. (Checkout cabang yang saya temukan via git br | grepdalam kasus saya)
Jack Casey
Salah satu favorit saya, ini! Pikir saya melakukan ini setiap hari.
MetalGodwin
Saya pikir ini sangat pintar sehingga Anda bisa melakukan itu, tetapi tidak yakin seberapa berguna itu sebenarnya. Apakah mengetik !!itu jauh lebih mudah daripada menekan tombol atas? Dan kemudian Anda masih bisa melihat perintah Anda. Jika menjalankan perintah lagi dapat diterima, saya pikir hanya menekan itu semudah (dan sedikit lebih dapat dimengerti dan transparan),
Svend Hesselholt Henne Hansen