पर्यावरण चर सेट करने के लिए मेरे पास निम्न पुनरावर्ती कार्य है:
function par_set {
PAR=$1
VAL=$2
if [ "" != "$1" ]
then
export ${PAR}=${VAL}
echo ${PAR}=${VAL}
shift
shift
par_set $*
fi
}
अगर मैं इसे स्वयं कहता हूं, तो यह दोनों चर और गूँज को stdout में सेट करता है:
$ par_set FN WORKS
FN=WORKS
$ echo "FN = "$FN
FN = WORKS
फ़ाइल के लिए पुन: प्रेषित करना भी काम करता है:
$ par_set REDIR WORKS > out
cat out
REDIR=WORKS
$ echo "REDIR = "$REDIR
REDIR = WORKS
लेकिन, अगर मैं किसी अन्य कमांड पर stdout करता हूं, तो चर सेट नहीं होता है:
$ par_set PIPE FAILS |sed -e's/FAILS/BARFS/'
PIPE=BARFS
$ echo "PIPE = "$PIPE
PIPE =
पाइप फ़ंक्शन को चर को निर्यात करने से क्यों रोकता है? क्या अस्थायी फ़ाइलों या नामित पाइपों का सहारा लिए बिना इसे ठीक करने का कोई तरीका है?
हल किया:
काम कोड गिल्स के लिए धन्यवाद:
par_set $(echo $*|tr '=' ' ') > >(sed -e's/^/ /' >> ${LOG})
इससे स्क्रिप्ट को इस प्रकार बुलाया जा सकता है:
$ . ./script.sh PROCESS_SUB ROCKS PIPELINES=NOGOOD
$ echo $PROCESS_SUB
ROCKS
$ echo $PIPELINES
NOGOOD
$ cat log
7:20140606155622162731431:script.sh:29581:Parse Command Line parameters. Params must be in matched pairs separated by one or more '=' or ' '.
PROCESS_SUB=ROCKS
PIPELINES=NOGOOD
पूर्ण कोड में रुचि रखने पर प्रोजेक्ट को बिटकॉइन https://bitbucket.org/adalby/monitor-bash पर होस्ट किया गया ।