के बीच सबसे महत्वपूर्ण अंतर
bash -c "$1"
तथा
eval "$1"
यह है कि पूर्व एक उप में चलता है और बाद में नहीं चलता है। इसलिए:
set -- 'var=something'
bash -c "$1"
echo "$var"
उत्पादन:
#there doesn't seem to be anything here
set -- 'var=something'
eval "$1"
echo "$var"
उत्पादन:
something
मुझे इस बात का कोई अंदाजा नहीं है कि कोई भी bash
उस तरीके से कभी भी निष्पादन योग्य का उपयोग क्यों करेगा । यदि आपको इसे लागू करना है, तो अंतर्निहित POSIX गारंटी का उपयोग करें sh
। या (subshell eval)
यदि आप अपने पर्यावरण की रक्षा करना चाहते हैं।
व्यक्तिगत रूप से, मैं शेल के .dot
ऊपर सभी को पसंद करता हूं ।
printf 'var=something%d ; echo "$var"\n' `seq 1 5` | . /dev/fd/0
आउटपुट
something1
something2
something3
something4
something5
लेकिन क्या आपको यह सब चाहिए?
उपयोग करने का एकमात्र कारण, वास्तव में, इस घटना में है कि आपका चर वास्तव में किसी अन्य को असाइन या मूल्यांकन करता है, या आउटपुट के लिए शब्द-विभाजन महत्वपूर्ण है।
उदाहरण के लिए:
var='echo this is var' ; $var
उत्पादन:
this is var
यह काम करता है, लेकिन केवल इसलिए echo
कि इसके तर्क गिनती के बारे में परवाह नहीं है।
var='echo "this is var"' ; $var
उत्पादन:
"this is var"
देख? डबल-कोट्स साथ आते हैं क्योंकि शेल के विस्तार के परिणाम का $var
मूल्यांकन नहीं किया जाता है quote-removal
।
var='printf %s\\n "this is var"' ; $var
उत्पादन:
"this
is
var"
लेकिन साथ eval
या sh
:
var='echo "this is var"' ; eval "$var" ; sh -c "$var"
उत्पादन:
this is var
this is var
जब हम उपयोग करते हैं eval
या sh
शेल विस्तार के परिणामों पर एक दूसरा पास लेता है और उनका मूल्यांकन एक संभावित कमांड के रूप में भी करता है, और इसलिए उद्धरण एक अंतर बनाते हैं। आप भी कर सकते हैं:
. <<VAR /dev/fd/0
${var:=echo "this is var"}
#END
VAR
आउटपुट
this is var
e='echo foo'; $e
ठीक काम करता है।