วิธีเข้าถึงค่าส่งคืนล่าสุดใน bash


69

สถานการณ์ง่าย ๆ : ฉันกำลังมองหาwsdlไฟล์ที่หายไปในระหว่างโครงการ

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

ตอนนี้ฉันรู้แล้วว่ามันอยู่ที่ไหนฉันต้องการทำบางสิ่งกับไฟล์นี้พูดแก้ไข แทนที่จะคัดลอก / วางเส้นทางที่อยู่ด้านหลังคำสั่งของฉันเป็นไปได้ไหมที่จะใช้เส้นทางที่ส่งคืนมาfindก่อนหน้านี้? เช่นเดียวกับมันเป็นไปได้ที่จะเข้าถึงอาร์กิวเมนต์สุดท้ายที่คุณได้พิมพ์กับท่านคำสั่งสุดท้ายกับ!$ ฉันได้อ่านแล้วว่าเป็นไปได้ด้วยแต่กลับมีข้อผิดพลาด:!!
$?0: command not found

$ echo $?
0: command not found

3
นี่ไม่ใช่ค่าส่งคืน แต่เป็นเอาต์พุต!
MirandaVeracruzDeLaHoyaCardina

ในการทำอย่างละเอียด "คืนค่า" จะเป็นตัวเลขเสมอ โดยปกติ 0 หมายถึงความสำเร็จและไม่ใช่ศูนย์หมายถึงความล้มเหลวบางประเภท สตริง (หรือข้อความ) ที่คำสั่งคายออกมาเรียกว่า "เอาท์พุท" ไม่ใช่ "คืนค่า"
Michael Dorst

คำตอบ:


33

รันคำสั่งในการทดแทนคำสั่ง:

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

ตอนนี้เอาต์พุตถูกเก็บไว้ในoutputตัวแปรซึ่งคุณสามารถใช้ได้หลายครั้งเท่าที่คุณต้องการ


11
นี่ไม่ใช่คำตอบที่ถูกต้อง $? คือ.
mcmlxxxiii

@mcmlxxxiii: $?ไม่มีเส้นทาง
choroba

1
คำขอโทษของฉันฉันสับสนโดยการใช้คำผิดreturnในคำถาม คำตอบของคุณถูกต้องอย่างแน่นอนสำหรับคำถามข้างต้น
mcmlxxxiii

4
$?มีสถานะทางออกของคำสั่งสุดท้าย
Brett Wagner

นี่คือคำตอบที่ฉันกำลังมองหา ฉันสนใจผลลัพธ์ของคำสั่งก่อนหน้าไม่ใช่ค่าความสำเร็จ / ล้มเหลว ขอบคุณมาก!
Joshua Pinter

74

ไม่มีตัวแปรทุบตีพิเศษสำหรับสิ่งนั้น

$? มีโค้ดทางออกของคำสั่งสุดท้าย (0 = สำเร็จ,> 0 = รหัสผิดพลาด)

คุณสามารถใช้เอาต์พุตของfindกับ-execแฟล็กเช่นนี้:

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

จะถูกแทนที่ด้วยชื่อไฟล์ที่พบโดย{} findนี่จะรันคำสั่งสำหรับทุกไฟล์ที่พบ หากคุณต้องการรันคำสั่งด้วยไฟล์ที่พบทั้งหมดเป็นอาร์กิวเมนต์ใช้+at at teh เช่นนี้:

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

นี่จะเปิดอินสแตนซ์ emacs หนึ่งไฟล์โดยที่พบไฟล์. wsdl ทั้งหมดที่เปิดอยู่

วิธีแก้ปัญหาทั่วไปเพิ่มเติมคือการจัดเก็บผลลัพธ์ในตัวแปร:

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

สิ่งนี้ใช้ได้กับทุกคำสั่งไม่ใช่แค่ค้นหา แม้ว่าคุณอาจใช้xargs:

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

เป็นไปได้หรือไม่ที่$?จะส่งคืนรหัสทางออกของคำสั่งอื่น? เช่น ping 1.1.1.1 -w 10; คืนเงิน $?
twnaing

1
$?มีโค้ดทางออกของคำสั่งก่อนหน้าไม่ว่าจะเป็นอะไรก็ตาม ดังนั้นคำตอบคือใช่
ahilsend

43

นี่คือแฮ็คด่วนที่ควรทำในสิ่งที่คุณต้องการด้วยการกดแป้นเพียงเล็กน้อยหากคุณไม่คำนึงว่าคำสั่งสุดท้ายจะถูกดำเนินการสองครั้ง

ใช้ backtick, ala:

`!!`

เช่น

$ ค้นหา -name HardToFind.txt
บาง / บ้า / เส้นทาง / เพื่อ / HardToFind.txt
$ vim `!! '

* แก้ไข: ฉันเห็นคำถามข้างต้นที่เชื่อมโยงอาจจะมีคำตอบนี้อยู่ด้วย ยังคงเกี่ยวข้องโดยตรงกับสิ่งนี้ดังนั้นปล่อยให้มัน แต่ขอโทษสำหรับล่อ


2
ฉลาดมาก. ฉันคิดว่านี่ควรเป็นคำตอบที่ได้รับการยอมรับเพราะมันแก้ปัญหากรณีส่วนใหญ่ที่ไม่รู้ว่าคุณต้องการเอาต์พุตจนกว่าคุณจะรันคำสั่งแล้ว
Paul Ruane

1
ฉันเห็นด้วยนี่คือสิ่งที่ฉันมาที่นี่เพื่อค้นหา การทำทุกอย่างในบรรทัดก่อนหน้าทำให้จุดประสงค์ของฉันพ่ายแพ้เพื่อตัดสินใจย้อนหลังว่าฉันต้องการทำบางสิ่งด้วยมูลค่าที่ส่งคืนล่าสุด (ชำระเงินสาขาที่ฉันพบผ่านgit br | grepในกรณีของฉัน)
แจ็คเคซี่ย์

หนึ่งในรายการโปรดของฉันนี่คือ! คิดว่าฉันทำสิ่งนี้เป็นประจำทุกวัน
MetalGodwin

ฉันคิดว่านี่ฉลาดมากที่คุณสามารถทำได้ แต่ไม่แน่ใจว่ามันมีประโยชน์จริง ๆ การพิมพ์!!นั้นง่ายกว่าการกดปุ่มขึ้นหรือไม่ จากนั้นคุณยังสามารถเห็นคำสั่งของคุณ หากเรียกใช้คำสั่งอีกครั้งเป็นที่ยอมรับฉันคิดว่าการกดปุ่มเป็นเรื่องง่าย (และสามารถเข้าใจได้ง่ายขึ้นและโปร่งใส)
Svend Hesselholt Henne Hansen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.