मैं बैश स्क्रिप्ट के अंदर चलाए गए अंतिम कमांड को प्रतिध्वनित करने की कोशिश कर रहा हूं। मैंने इसे कुछ के साथ करने का एक तरीका पाया history,tail,head,sed
जो ठीक काम करता है जब कमांड एक स्क्रिप्ट लाइनर से मेरी स्क्रिप्ट में एक विशिष्ट रेखा का प्रतिनिधित्व करते हैं। हालाँकि कुछ परिस्थितियों में मुझे अपेक्षित आउटपुट नहीं मिलता है, उदाहरण के लिए जब कमांड को एक case
स्टेटमेंट के अंदर डाला जाता है :
लिपी:
#!/bin/bash
set -o history
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
case "1" in
"1")
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
;;
esac
उत्पादन:
Tue May 24 12:36:04 CEST 2011
last command is [date]
Tue May 24 12:36:04 CEST 2011
last command is [echo "last command is [$last]"]
[क्यू] क्या कोई मेरी मदद कर सकता है जो अंतिम रन कमांड को इको करने का एक तरीका खोज सकता है, भले ही इस कमांड को बैश स्क्रिप्ट के भीतर कैसे / कहाँ कहा जाता है?
मेरा जवाब
मेरे साथी SO'ers के बहुत सराहनीय योगदान के बावजूद, मैंने एक run
फ़ंक्शन लिखने का विकल्प चुना - जो अपने सभी मापदंडों को एक कमांड के रूप में चलाता है और कमांड और इसके त्रुटि कोड को प्रदर्शित करता है जब यह विफल हो जाता है - निम्नलिखित लाभों के साथ:
-मुझे केवल आवश्यकता है उन आदेशों को पहले से बताएं जिन्हें मैं जांचना चाहता हूं, run
जो उन्हें एक पंक्ति में रखता है और मेरी स्क्रिप्ट की संक्षिप्तता को प्रभावित नहीं करता है-
जब भी स्क्रिप्ट इन आदेशों में से किसी एक पर विफल होती है, तो मेरी स्क्रिप्ट की अंतिम आउटपुट लाइन एक संदेश है जो स्पष्ट रूप से प्रदर्शित करती है जो कमांड इसके निकास कोड के साथ विफल रहता है, जो डिबगिंग को आसान बनाता है
उदाहरण लिपि:
#!/bin/bash
die() { echo >&2 -e "\nERROR: $@\n"; exit 1; }
run() { "$@"; code=$?; [ $code -ne 0 ] && die "command [$*] failed with error code $code"; }
case "1" in
"1")
run ls /opt
run ls /wrong-dir
;;
esac
उत्पादन:
$ ./test.sh
apacheds google iptables
ls: cannot access /wrong-dir: No such file or directory
ERROR: command [ls /wrong-dir] failed with error code 2
मैंने कई तर्कों के साथ विभिन्न आदेशों का परीक्षण किया, चर को तर्क के रूप में उद्धृत किया, तर्कों को उद्धृत किया ... और run
फ़ंक्शन ने उन्हें नहीं तोड़ा। एकमात्र मुद्दा जो मुझे अब तक मिला है वह एक प्रतिध्वनि को चलाने के लिए है जो टूट जाता है लेकिन मैं वैसे भी अपने इको को जांचने की योजना नहीं बनाता हूं।
run()
जब उद्धरण का उपयोग किया जाता है तो यह ठीक से काम नहीं करता है, उदाहरण के लिए यह विफल रहता हैrun ssh-keygen -t rsa -C info@example.org -f ./id_rsa -N ""
:।