कुछ गोले में (सहित bash):
IFS=: command eval 'p=($PATH)'
(साथ में bash, commandयदि आप श / POSIX एमुलेशन में नहीं हैं तो इसे छोड़ सकते हैं )। लेकिन सावधान रहें कि जब अछूता चर का उपयोग करते हैं, तो आपको आम तौर पर भी इसकी आवश्यकता होती है set -f, और अधिकांश गोले में इसके लिए कोई स्थानीय गुंजाइश नहीं होती है।
Zsh के साथ, आप कर सकते हैं:
(){ local IFS=:; p=($=PATH); }
$=PATHशब्द विभाजन को मजबूर करने के लिए किया जाता है जो डिफ़ॉल्ट रूप से नहीं किया जाता है zsh(चर विस्तार पर ग्लोबिंग नहीं किया जाता है, इसलिए आपको set -fतब तक ज़रूरत नहीं है जब तक कि श एम्यूलेशन में न हो)।
(){...}(या function {...}) को अनाम फ़ंक्शंस कहा जाता है और आम तौर पर स्थानीय स्कोप सेट करने के लिए उपयोग किया जाता है। कार्यों में स्थानीय गुंजाइश का समर्थन करने वाले अन्य गोले के साथ, आप कुछ ऐसा कर सकते हैं:
e() { eval "$@"; }
e 'local IFS=:; p=($PATH)'
POSIX गोले में चर और विकल्पों के लिए एक स्थानीय गुंजाइश को लागू करने के लिए, आप https://github.com/stephane-chazelas/misc-scripts/blob/master/locvar.sh पर दिए गए कार्यों का उपयोग कर सकते हैं । तब आप इसका उपयोग कर सकते हैं:
. /path/to/locvar.sh
var=3,2,2
call eval 'locvar IFS; locopt -f; IFS=,; set -- $var; a=$1 b=$2 c=$3'
(वैसे, यह $PATHउस तरह से विभाजित करने के लिए अमान्य है zshजैसे कि अन्य गोले में, आईएफएस फ़ील्ड सीमांकक है, फ़ील्ड पृथक्करण नहीं)।
IFS=$'\n' a=($str)
क्या सिर्फ दो असाइनमेंट हैं, एक के बाद एक जैसे a=1 b=2।
इस पर स्पष्टीकरण का एक नोट var=value cmd:
में:
var=value cmd arg
खोल कार्यान्वित /path/to/cmdएक नई प्रक्रिया और पास में cmdऔर argमें argv[]और var=valueमें envp[]। यह वास्तव में एक चर असाइनमेंट नहीं है, लेकिन निष्पादित कमांड के लिए अधिक पासिंग वातावरण चर है । बॉर्न या कॉर्न शेल में set -k, आप इसे लिख भी सकते हैं cmd var=value arg।
अब, यह उन निर्माणों या कार्यों पर लागू नहीं होता है जिन्हें निष्पादित नहीं किया जाता है । बॉर्न शेल में var=value some-builtin, varअंत में , var=valueअकेले की तरह सेट किया जा रहा है । उदाहरण के लिए इसका मतलब है कि var=value echo foo(जो उपयोगी नहीं है) का व्यवहार इस बात पर निर्भर करता है कि echoबिल्टिन है या नहीं।
POSIX और / या kshउसमें बदलाव किया गया है कि उस बॉर्न व्यवहार में केवल विशेष बिल्डिन नामक बिल्डरों की श्रेणी के लिए होता है । evalएक विशेष बिलिन है, readनहीं है। गैर विशेष बिल्डिन के लिए, केवल बिलिन के निष्पादन के लिए var=value builtinसेट करता है , varजो बाहरी कमांड चलाने के दौरान समान व्यवहार करता है।
commandआदेश दूर करने के लिए इस्तेमाल किया जा सकता विशेष उन की विशेषता विशेष builtins । हालांकि POSIX ने अनदेखी की है कि evalऔर .बिल्डरों के लिए इसका मतलब है कि गोले को एक चर स्टैक को लागू करना होगा (भले ही यह आदेशों को सीमित localया typesetगुंजाइश को निर्दिष्ट नहीं करता है ), क्योंकि आप कर सकते हैं:
a=0; a=1 command eval 'a=2 command eval echo \$a; echo $a'; echo $a
या और भी:
a=1 command eval myfunction
साथ myfunctionएक समारोह किया जा रहा है का उपयोग कर या स्थापित करने $aऔर संभावित रूप से बुला command eval।
यह वास्तव में एक अनदेखी थी क्योंकि ksh(जो कल्पना ज्यादातर पर आधारित है) ने इसे लागू नहीं किया (और एटी एंड टी kshऔर zshअभी भी नहीं), लेकिन आजकल, उन दो को छोड़कर, अधिकांश गोले इसे लागू करते हैं। व्यवहार शेल में भिन्न होता है, हालांकि चीजों में:
a=0; a=1 command eval a=2; echo "$a"
हालांकि। localगोले का उपयोग करना जो इसका समर्थन करता है, स्थानीय दायरे को लागू करने का अधिक विश्वसनीय तरीका है।
IFS=: command eval …सेट करता है , लेकिन ksh 93u में नहीं। यह देखने के लिए असामान्य है कि ksh को ऑड-नॉन-कंप्लेंट-वन-आउट किया जा रहा है।IFSeval