क्लासिक बॉर्न शेल समर्थित, और बैश और कॉर्न शेल अभी भी समर्थन करते हैं, एक -kविकल्प। जब यह प्रभाव में होता है, ddतो कमांड लाइन पर कहीं भी किसी भी तरह का 'कमांड' विकल्प स्वचालित रूप से पर्यावरण चर में बदल दिया जाता है:
$ set -k
$ echo a=1 b=2 c=3
$
यह आश्वस्त होना थोड़ा कठिन है कि वे पर्यावरण चर रहे हैं; यह काम मेरे लिए चल रहा है:
$ set -k
$ env | grep '^[a-z]=' # No environment a, b, c
$ bash -c 'echo "Args: $*" >&2; env' a=1 b=2 c=3 | grep '^[a-z]='
Args:
a=1
b=2
c=3
$ set +k
$ bash -c 'echo "Args: $*" >&2; env' a=1 b=2 c=3 | grep '^[a-z]='
Args: b=2 c=3
$
पहला env | grepएकल लोअर-केस अक्षर के साथ कोई पर्यावरण चर नहीं दिखाता है। पहले से bashपता चलता है कि स्क्रिप्ट के माध्यम से निष्पादित कोई तर्क नहीं है -c, और पर्यावरण में तीन एकल-अक्षर चर शामिल हैं। set +kरद्द -k, और शो है कि एक ही आदेश अब यह करने के लिए पारित कर दिया तर्क हैं। ( स्क्रिप्ट के a=1रूप में व्यवहार किया गया था $0; आप उचित प्रतिध्वनि के साथ यह भी साबित कर सकते हैं।)
यह वही प्राप्त करता है जो सवाल पूछता है - कि टाइपिंग ./script.sh a=1 b=2के समान होना चाहिए a=1 b=2 ./script.sh।
इस बात से अवगत रहें कि यदि आप स्क्रिप्ट के अंदर इस तरह की कोशिश करते हैं तो आप समस्याओं में भाग जाते हैं:
if [ -z "$already_invoked_with_minus_k" ]
then set -k; exec "$0" "$@" already_invoked_with_minus_k=1
fi
"$@"शब्दशः व्यवहार किया जाता है; यह नहीं काम शैली चर (दोनों में खोजने के लिए फिर से विश्लेषण किया जाता है bashऔर ksh)। मैंने कोशिश की:
#!/bin/bash
echo "BEFORE"
echo "Arguments:"
al "$@"
echo "Environment:"
env | grep -E '^([a-z]|already_invoked_with_minus_k)='
if [ -z "$already_invoked_with_minus_k" ]
then set -k; exec "$0" "$@" already_invoked_with_minus_k=1
fi
echo "AFTER"
echo "Arguments:"
al "$@"
echo "Environment:"
env | grep -E '^([a-z]|already_invoked_with_minus_k)='
unset already_invoked_with_minus_k
और केवल already_invoked_with_minus_kपर्यावरण चर exec'डी स्क्रिप्ट में सेट किया गया है ।