Làm thế nào để truy cập giá trị trả lại cuối cùng trong bash?


69

Kịch bản đơn giản: Tôi đang tìm kiếm một wsdltập tin bị mất ở giữa dự án.

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

Bây giờ tôi biết nó ở đâu, tôi muốn làm một cái gì đó với tập tin này, nói rằng chỉnh sửa nó. Thay vì sao chép / dán đường dẫn phía sau lệnh của tôi, có thể sử dụng đường dẫn được trả về findtrước đó không? Cũng giống như có thể truy cập vào đối số cuối cùng mà bạn đã nhập !$hoặc lệnh cuối cùng của bạn !!.
Tôi đã đọc rằng điều đó là có thể với $?, nhưng nó chỉ trả về cho tôi một lỗi:0: command not found

$ echo $?
0: command not found

3
Đây không phải là giá trị trả về, nó là đầu ra!
MirandaVeracruzDeLaHoyaCardina

Để giải thích, "giá trị trả về" luôn là một con số. Thông thường 0 có nghĩa là thành công và khác không có nghĩa là một loại thất bại. Chuỗi (hoặc văn bản) mà lệnh phun ra được gọi là "đầu ra" của nó, không phải là "giá trị trả về" của nó.
Michael Dorst

Câu trả lời:


33

Chạy lệnh trong thay thế lệnh:

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

Đầu ra hiện được lưu trữ trong outputbiến mà bạn có thể sử dụng bao nhiêu lần tùy thích.


11
Đây không phải là một câu trả lời đúng. $? Là.
mcmlxxxiii

@mcmlxxxiii: $?không chứa đường dẫn.
choroba

1
Tôi xin lỗi, tôi đã bối rối bởi việc sử dụng sai thuật ngữ returntrong câu hỏi. Câu trả lời của bạn là hoàn toàn chính xác cho câu hỏi trên.
mcmlxxxiii

4
$?chứa trạng thái thoát lệnh cuối cùng
Brett Wagner

Đây là câu trả lời mà tôi đang tìm kiếm. Tôi quan tâm đến đầu ra của lệnh trước không phải là giá trị trả về thành công / thất bại. Cảm ơn bạn!
Joshua Pinter

74

Không có biến bash đặc biệt cho điều đó.

$? chứa mã thoát của lệnh cuối cùng (0 = thành công,> 0 = mã lỗi)

Bạn có thể sử dụng đầu ra của findvới -execcờ, như thế này:

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

Các {}được thay thế bằng tên tập tin tìm thấy bằng find. Điều này sẽ thực thi lệnh cho mọi tập tin tìm thấy. Nếu bạn muốn thực thi một lệnh với tất cả các tệp được tìm thấy dưới dạng đối số, hãy sử dụng một +kết thúc như sau:

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

Điều này sẽ mở một cá thể emacs với tất cả các tệp .wsdl được tìm thấy được mở trong đó.

Một giải pháp tổng quát hơn là lưu trữ đầu ra trong một biến:

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

Điều này hoạt động với tất cả các lệnh, không chỉ tìm thấy. Mặc dù bạn cũng có thể sử dụng xargs:

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

Có thể $?trả lại mã thoát của lệnh khác? ví dụ ping 1.1.1.1 -w 10; trả lại $?
thúc

1
$?chứa mã thoát của lệnh trước đó, bất kể đó là gì. Vì vậy, câu trả lời là có.
ahilsend

43

Đây là một bản hack nhanh nên làm những gì bạn muốn với tổ hợp phím tối thiểu, nếu bạn không nhớ rằng lệnh cuối cùng được thực thi hai lần.

Sử dụng backtick, ala:

`!!`

ví dụ

$ tìm. -name HardToFind.txt
một số / crazy / path / to / HardToFind.txt
$ vim `!!`

* chỉnh sửa: Tôi thấy câu hỏi "có thể bị lừa" được liên kết ở trên cũng có câu trả lời này. vẫn liên quan trực tiếp đến cái này, vì vậy hãy bỏ nó đi, nhưng xin lỗi vì bị lừa.


2
Rất thông minh. Tôi nghĩ rằng đây nên là câu trả lời được chấp nhận vì nó giải quyết trường hợp phổ biến nhất là không biết bạn cần đầu ra cho đến khi bạn đã chạy lệnh.
Paul Ruane

1
Tôi đồng ý, đây là những gì tôi đến đây tìm kiếm. Làm bất cứ điều gì trên dòng trước đánh bại mục đích của tôi, để quyết định hồi tố tôi muốn làm một cái gì đó với giá trị trả lại cuối cùng. (Kiểm tra một chi nhánh tôi tìm thấy git br | greptrong trường hợp của tôi)
Jack Casey

Một trong những sở thích của tôi, đây là! Hãy nghĩ rằng tôi làm điều này trên cơ sở hàng ngày.
MetalGodwin

Tôi nghĩ rằng điều này rất thông minh mà bạn có thể làm điều đó, nhưng không chắc nó thực sự hữu ích như thế nào. Là gõ !!dễ dàng hơn nhiều so với nhấn phím lên? Và sau đó bạn vẫn có thể thấy lệnh của bạn. Nếu chạy lại lệnh là chấp nhận được, tôi nghĩ chỉ cần nhấn lên là dễ dàng (và dễ hiểu và minh bạch hơn một chút),
Svend Hesselholt Henne Hansen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.