बैश में अंतिम रिटर्न मान कैसे प्राप्त करें?


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 का मतलब सफलता है, और गैर-शून्य का मतलब किसी प्रकार की विफलता है। वह स्ट्रिंग (या पाठ) जिसे कमांड थूकता है उसे "आउटपुट" के रूप में संदर्भित किया जाता है, न कि इसका "रिटर्न वैल्यू"।
माइकल डोरस्ट

जवाबों:


33

कमांड प्रतिस्थापन में कमांड चलाएँ:

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

आउटपुट अब outputवैरिएबल में संग्रहित है जिसे आप जितनी बार चाहें उपयोग कर सकते हैं।


10
यह सही जवाब नहीं है। $? है।
mcmlxxxiii 21

@mcmlxxxiii: $?पथ शामिल नहीं हैं।
कोरोबा

1
मेरी क्षमा याचना, मैं returnप्रश्न में शब्द के दुरुपयोग से भ्रमित था । उपरोक्त प्रश्न के लिए आपका उत्तर बिल्कुल सही है।
mcmlxxxiii

4
$?अंतिम कमांड के निकास की स्थिति शामिल है
ब्रेट वैगनर

यह वह उत्तर था जिसकी मुझे तलाश थी। मैं पिछले कमांड के आउटपुट में दिलचस्पी रखता हूं सफलता / असफल रिटर्न वैल्यू नहीं। इसलिए तुम्हे धन्यवाद!
जोशुआ पिंटर

74

उसके लिए कोई विशेष बैश वैरिएबल नहीं है।

$? अंतिम कमांड का निकास कोड होता है (0 = सफलता,> 0 = त्रुटि-कोड)

आप इस तरह झंडे के findसाथ आउटपुट का उपयोग कर सकते हैं -exec:

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

{}फ़ाइल नाम के द्वारा पाया साथ बदल दिया है find। यह हर मिली फ़ाइल के लिए कमांड निष्पादित करेगा। यदि आप सभी मिली फाइलों के साथ एक कमांड निष्पादित करना चाहते हैं, क्योंकि तर्क +इस तरह से अंत में उपयोग करते हैं:

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

यह सभी पाया गया। Emdl फ़ाइलों के साथ एक emacs इंस्टेंस खोलेगा।

एक अधिक सामान्य समाधान आउटपुट को एक चर में संग्रहीत करना है:

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

यह सभी आदेशों के साथ काम करता है, न कि केवल खोज। यद्यपि आप भी उपयोग कर सकते हैं xargs:

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

क्या $?अन्य कमांड के निकास कोड को वापस करना संभव है? उदाहरण के लिए पिंग 1.1.1.1 -w 10; वापसी $?
twnaing

1
$?पिछले कमांड का निकास कोड है, जो कुछ भी है। तो उत्तर हां है।
आहिल्स

43

यहां एक त्वरित हैक है जिसे आपको न्यूनतम कीस्ट्रोक्स के साथ करना चाहिए, यदि आपको कोई आपत्ति नहीं है कि अंतिम कमांड दो बार निष्पादित की जाती है।

बैकटिक, अला का उपयोग करें:

`!!`

जैसे

$ मिल गया। -name HardToFind.txt
कुछ / पागल / path / to / HardToFind.txt
$ विम @ !!

* संपादित करें: मैं ऊपर जुड़ा हुआ "संभवतः ठगा हुआ" प्रश्न देखता हूं, जिसमें यह उत्तर भी है। अभी भी सीधे इस एक के लिए प्रासंगिक है, इसलिए इसे छोड़ रहा है, लेकिन डूप के लिए खेद है।


2
बहुत चालाक। मुझे लगता है कि यह स्वीकृत जवाब होना चाहिए क्योंकि यह सबसे सामान्य मामले को हल करता है कि आपको तब तक आउटपुट की आवश्यकता नहीं है जब तक आप पहले से ही कमांड नहीं चलाते हैं।
पॉल रूएन

1
मैं सहमत हूं, यह वही है जो मैं यहां खोज रहा था। पिछली पंक्ति में कुछ भी करने से मेरा उद्देश्य पराजित हो जाता है, यह निश्चित रूप से तय करना है कि मैं अंतिम लौटे मूल्य के साथ कुछ करना चाहता हूं। ( git br | grepमेरे मामले में मेरे द्वारा पाई गई एक शाखा की जाँच करें )
जैक केसी

मेरे पसंदीदा में से एक, यह है! मुझे लगता है कि मैं यह दिन-प्रतिदिन के आधार पर करता हूं।
मेटलग्विन

मुझे लगता है कि यह बहुत चालाक है कि आप ऐसा कर सकते हैं, लेकिन यह सुनिश्चित नहीं है कि यह वास्तव में कितना उपयोगी है। क्या टाइपिंग !!कुंजी को दबाने से ज्यादा आसान है? और फिर आप अभी भी अपनी कमान देख सकते हैं। यदि कमांड चलाना फिर से स्वीकार्य है, तो मुझे लगता है कि बस दबाना आसान है (और थोड़ा और अधिक समझने योग्य और पारदर्शी है),
स्वेन्द हेसेलहोल्त् हेने हेन्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.