bash पिछली शेल कमांड का एक अन्य स्क्रिप्ट में कोड निकालना




shell zsh (3)

मैं अपनी सूचना स्क्रिप्ट को गोद लेने की कोशिश कर रहा हूं स्क्रिप्ट का काम करने का तरीका यह है कि मैं इसे लंबे समय से चलने वाली शेल कमांड के पीछे रखता हूं और फिर लंबी-लंबी स्क्रिप्ट समाप्त होने के बाद सभी प्रकार की नोटिफिकेशन मिलते हैं।

उदाहरण के लिए:

sleep 100; my_notify

लंबे समय तक चलने वाली स्क्रिप्ट के निकास कोड को प्राप्त करना अच्छा होगा, समस्या यह है कि my_notify कॉल करने से $? पहुंच नहीं है जो एक नई प्रक्रिया बनाता है $? चर।

की तुलना करें:

~ $: ls nonexisting_file; echo "exit code: $?"; echo "PPID: $PPID"
ls: nonexisting_file: No such file or directory
exit code: 1
PPID: 6203

बनाम

~ $: ls nonexisting_file; my_notify      
ls: nonexisting_file: No such file or directory
exit code: 0
PPID: 6205

my_notify स्क्रिप्ट में निम्न में है:

#!/bin/sh
echo "exit code: $?"
echo "PPID: $PPID"

मैं कमांड की संरचना को बहुत ज्यादा बिना बदले हुए पिछले कमांड के बाहर निकलने का कोड प्राप्त करने का एक तरीका ढूंढ रहा हूं। मैं इस तथ्य से अवगत हूं कि यदि मैं इसे अधिक time तरह काम करने के लिए बदल देता हूं, जैसे my_notify longrunning_command... मेरी समस्या का समाधान हो जाएगा, लेकिन वास्तव में मुझे ऐसा लगता है कि मैं एक आदेश के अंत में इसे my_notify longrunning_command... मुझे my_notify longrunning_command... डर लगता है दूसरा समाधान

क्या यह किया जा सकता है या क्या वह गोले के काम के साथ मूल रूप से असंगत है?

मेरा शेल zsh लेकिन मैं इसे भी साथ ही bash साथ काम करना चाहूंगा।


यह असंगत है। $? केवल मौजूदा शेल के भीतर मौजूद है; यदि आप इसे उप-प्रोसेस में उपलब्ध करना चाहते हैं, तो आपको उसे एक वातावरण चर में कॉपी करना होगा

विकल्प एक शेल फ़ंक्शन लिखना है जो इसका उपयोग किसी तरह से करता है।


आपको यह पूरा करने के लिए वास्तव में शेल फंक्शन का उपयोग करना होगा एक सरल स्क्रिप्ट के लिए जैसे यह zsh और bash दोनों में काम करना बहुत आसान होना चाहिए। बस एक फ़ाइल में निम्नलिखित जगह है:

my_notify() {
  echo "exit code: $?"
  echo "PPID: $PPID"
}

फिर स्रोत जो आपकी शेल स्टार्टअप फाइलों से फ़ाइल है यद्यपि के बाद से आपके इंटरेक्टिव शेल के भीतर से चलने के बाद, आप $ PPID की बजाय $ $ का उपयोग करना चाहेंगे।


इसे लागू करने के लिए एक विधि EOF टैग और एक मास्टर स्क्रिप्ट का उपयोग करने के लिए हो सकती है जो आपकी my_notify स्क्रिप्ट बना देगा।

#!/bin/bash

if [ -f my_notify ] ; then
rm -rf my_notify
fi

if [ -f my_temp ] ; then
rm -rf my_temp
fi

retval=`ls non_existent_file &> /dev/null  ; echo $?`
ppid=$PPID
echo "retval=$retval" 
echo "ppid=$ppid" 
cat >> my_notify << 'EOF'
#!/bin/bash

echo "exit code: $retval"
echo " PPID =$ppid"
EOF

sh my_notify 

आप अपने उद्देश्य के लिए इस स्क्रिप्ट को परिष्कृत कर सकते हैं।





exit-code