बाश में `सेट -k` विकल्प का व्यावहारिक उपयोग


16

हम set -kबैश में विकल्प का उपयोग कब करते हैं ?

बैश संदर्भ मैनुअल कहता है,

असाइनमेंट स्टेटमेंट के रूप में सभी तर्क वातावरण में एक कमांड के लिए रखे गए हैं, न कि केवल उन लोगों के लिए जो कमांड नाम से पहले हैं।

मैं समझता हूं कि विकल्प क्या करता है, लेकिन हम इसकी आवश्यकता होने पर कल्पना नहीं कर सकते।


सही धारणा। -kहमें उन्हें रिफैक्ट करने की आवश्यकता के बिना 30 साल पुरानी शेल स्क्रिप्ट चलाने की अनुमति देता है। इसके बजाय उपसर्ग सिंटैक्स का उपयोग करके अस्थायी पर्यावरण चर पास करें:var1=x var2=y command ...
हेंक लैंगवेल्ड

जवाबों:


14

आप मूल रूप से इसका उपयोग कभी भी कर सकते हैं, जिसे आप "इंजेक्ट" करना चाहते हैं पर्यावरण चर एक शेल स्क्रिप्ट (तर्क के रूप में) में पारित किए गए हैं जैसे कि वे पर्यावरण के भीतर सेट किए गए थे export, लेकिन बिना उन्हें स्थायी रूप exportसे कमांड चलाने से पहले सूची में रहते हैं ।

नोट: वहाँ भी की लंबी रूप है -k, स्विच set -o keyword

उदाहरण

$ cat cmd1.bash 
#!/bin/bash

echo $VARCMD

अब अगर मैं set -k:

$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi

लेकिन अगर मैं सिर्फ उपरोक्त स्क्रिप्ट चलाने के लिए था:

$ ./cmd1.bash 

$

निर्यात क्या कर रहा है?

$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands.  If VALUE is supplied, assign VALUE before exporting.
...

तो अगर हम export | grep VARअपनी स्क्रिप्ट में जोड़ना चाहते थे तो:

$ cat cmd2.bash 
#!/bin/bash

echo $VARCMD
export | grep VAR

और हमने अपने उपरोक्त परीक्षणों को फिर से चलाया:

$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"

लेकिन बिना set -k:

$ ./cmd2.bash 

$

तो set -kहमें बड़े पैमाने पर अस्थायी रूप से निर्यात करने की अनुमति है।

एक और उदाहरण

$ cat cmd3.bash 
#!/bin/bash

echo $VARCMD1
echo $VARCMD2
export | grep VAR

जब हम कई चर सेट करते हैं तो वे सभी निर्यात होते हैं:

$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"

तो फिर यह सिर्फ सभी पर्यावरण चर इंजेक्शन है?

नहीं -k बहुत स्पष्ट बात कर रहा है। यह केवल निर्यात चर है जो कमांड लाइन पर शामिल थे जब एक कमांड निष्पादित किया गया था।

उदाहरण

कहो मैं इस चर सेट:

$ VARCMD1="hi"

अब जब हम एक ही कमांड को छोड़ते हैं VARCMD1="hi":

$  set -k; ./cmd3.bash VARCMD2="bye"; set +k

bye
declare -x VARCMD2="bye"

लेकिन यह क्यों मौजूद है?

मुझे यह स्रोत मिला, जो इस विशेषता के बारे में थोड़ा समझाता है, जिसका शीर्षक है: "कीवर्ड पैरामीटर असाइनमेंट स्ट्रिंग्स"। नोट: स्रोत URL एक IP पते का उपयोग करता है इसलिए मैं इसे SE पर सीधे यहां लिंक नहीं कर सकता।

http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html

जब किसी भी भाषा में प्रोग्रामिंग की जाती है, तो विश्वसनीय कोड लिखने के लिए चर और उसका मूल्य गुजरना महत्वपूर्ण होता है। पूर्णांक और सरणी चर प्रकार के अलावा, अन्य सभी शेल चर स्ट्रिंग को उनके मान के रूप में स्वीकार करते हैं। शेल प्रोग्रामिंग भाषा के बारे में बात करते समय, सुसंगत होने के लिए, हम "कीवर्ड पैरामीटर" वाक्यांश को पसंद करते हैं। कीवर्ड पैरामीटर में मान निर्दिष्ट करते समय यह देखने के लिए कुछ बिंदु दिए गए हैं:

  • किसी भी अप्रत्याशित प्रभाव से बचने के लिए, कमांड स्ट्रिंग के सामने हमेशा पैरामीटर असाइनमेंट रखें।

    बी शेल में, कीवर्ड मापदंडों के निर्दिष्ट मूल्यों को (स्थानीय) शेल चर में संग्रहीत किया जाएगा। Bash और ksh में, कीवर्ड पैरामीटर असाइनमेंट स्ट्रिंग्स पूर्ववर्ती कमांड शेल वेरिएबल्स में संग्रहीत नहीं किया जाएगा। वे केवल वर्तमान कमांड को निष्पादित करने के लिए कांटेक्ट किए गए तत्काल उपप्रकार को प्रभावित करते हैं। कीवर्ड पैरामीटर असाइनमेंट स्ट्रिंग्स की एक पंक्ति अकेले (स्थानीय) शेल चर में संग्रहीत होती है। कीवर्ड पैरामीटर असाइनमेंट स्ट्रिंग्स भी उर्फ, डिक्लेयर, टाइपसेट, एक्सपोर्ट, आसानी से और स्थानीय बिलिन कमांड्स के तर्क के रूप में प्रकट हो सकते हैं। [बैश संदर्भ मैनुअल की धारा 3.4]

  • कीवर्ड पैरामीटर असाइनमेंट स्ट्रिंग्स को कमांड के निष्पादन के लिए तर्क के रूप में माना जाएगा, यदि उन्हें कमांड नाम के बाद रखा गया है।

  • कीवर्ड पैरामीटर को सेट कमांड द्वारा हेरफेर किया जा सकता है।

इस लिंक में, ss64.com/bash/set.html , क्योंकि set -kउन्होंने विकल्प के -o keywordअलावा दिया है -k। क्या इसका मतलब कुछ है?
रमेश

@ रमेश - set -o keywordका लंबा रूप है set -k। देखते हैं help set | grep -- '-k'
स्लम

आह अच्छा। मैं अपने सिर को लंबे समय से खरोंच रहा था यह समझने की कोशिश कर रहा था कि 2 विकल्प क्यों हैं। हमेशा की तरह सही उत्तर :)
रमेश

4
./cmd.bash VARCMD=hiset -kयह ठीक उसी तरह से काम करने के लिए प्राप्त करने की आवश्यकता है जिस तरह VARCMD=hi ./cmd.bashसे बिना करता है set -k। ओपी का विशिष्ट प्रश्न यह है कि ./cmd.bash VARCMD=hiफॉर्म का समर्थन करने के लिए बैश की आवश्यकता है
iruvar

@ 1_CR - अच्छा बिंदु। मेरा मानना ​​है कि इसे स्टाइल से ज्यादा कुछ करना है, मैं देखूंगा कि क्या मुझे एक वास्तविक स्रोत मिल सकता है।
slm

8

किसी भी व्यावहारिक उपयोग की set -kसंभावना सिर्फ व्यक्तिगत शैली है। कुछ - शायद वे जो प्रोग्रामिंग भाषाएं पसंद करते हैं जो फ़ंक्शन कॉल में कीवर्ड तर्क का उपयोग करने की क्षमता प्रदान करते हैं, या वे कुछ लोग जो ddकमांड के सिंटैक्स को पसंद करते हैं - पसंद कर सकते हैं

सेट -क
...
कमांड var 1 = val 1 var 2 = val 2

सेवा

var 1 = val 1 var 2 = val 2 कमांड

POSIX मानक में सेट कमांड के औचित्य में कुछ गोले में मौजूद विकल्प को वास्तविक कारण बताया गया है :

The following set flags were omitted intentionally with the following rationale:

The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
    set name=value
had to be used to assign values to shell variables.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.