तर्क के बिना सेट कमांड क्या करता है?


22

setबिना तर्क के आज्ञा क्या करती है?

जैसा कि मैं देख सकता हूं कि यह मेरे पर्यावरण चर को केवल envकमांड की तरह, लेकिन वर्णमाला के क्रम में प्रिंट करता है । और आगे यह कुछ अलग जानकारी प्रिंट करता है (चर; कार्य?) जैसे:

__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}

यह क्या है और यह कहां से आता है?

मुझे setतर्क के बिना कमांड के बारे में जानकारी नहीं मिल सकती है। वास्तव में मेरे पास लिनक्स वितरण के manलिए बिल्कुल भी पेज नहीं है set


1
"यह बिलिन इतना जटिल है कि यह अपने स्वयं के अनुभाग के योग्य है।" डॉक्स
आकाशगंगा

जवाबों:


17

set एक शेल निर्मित है जो सभी शेल चर दिखाता है, न केवल पर्यावरण वाले, और शेल फ़ंक्शन भी, जो कि आप सूची के अंत में देख रहे हैं।

चर एक सिंटैक्स के साथ प्रदर्शित किए जाते हैं जो उन्हें लाइनों या निष्पादित होने पर सेट करने की अनुमति देते हैं।

से bash मैन्युअल पृष्ठ :

यदि कोई विकल्प या तर्क की आपूर्ति नहीं की जाती है, तो सेट सभी शेल चर और कार्यों के नाम और मूल्यों को प्रदर्शित करता है, जो वर्तमान लोकेल के अनुसार सॉर्ट किया जाता है, जिसे वर्तमान में सेट किए गए चर को सेट या रीसेट करने के लिए इनपुट के रूप में पुन: उपयोग किया जा सकता है।

विभिन्न गोले पर, व्यवहार आवश्यक रूप से समान नहीं है; उदाहरण के लिए, ksh setशेल फ़ंक्शन प्रदर्शित नहीं करता है।


3
ऐसा इसलिए क्योंकि kshशेल वेरिएबल में फंक्शन डेफिनिशन को स्टोर नहीं करते हैं।
कोउन्ग्लम

2
@ cuonglm dgk द्वारा किया गया एक बुद्धिमान डिजाइन निर्णय! ;-)
जेलेग्रे

7

क्योंकि setआउटपुट और which setरिटर्न कुछ भी नहीं है आप जानते हैं कि यह आपके द्वारा उपयोग किए जा रहे शेल का हिस्सा है, संभावित रूप से बैश।

आदमी बैश में कई बार इसका उल्लेख करता है लेकिन ऑनलाइन प्रलेखन में लिंक करना आसान है ।

यह बिलिन इतनी जटिल है कि यह अपने स्वयं के खंड के योग्य है। सेट आपको शेल विकल्पों के मूल्यों को बदलने और स्थितीय मापदंडों को सेट करने, या शेल चर के नाम और मूल्यों को प्रदर्शित करने की अनुमति देता है।

सेट की कॉल विनिर्देश है:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

इसलिए यदि आप इसे कमांड लाइन पर उस व्यक्ति में ढूंढना चाहते हैं जिसे आप खोज सकते हैं

/set.*abef

which setआपके खोल पर निर्भर करता है। कम से कम zshयह आपके लिए रिपोर्ट करेगा। तुम भी पढ़ सकते हैं इस अधिक जानकारी के लिए।
कोउंगलम

यह संभावना नहीं है कि सवाल किसी भी चीज के बारे में है, लेकिन यह एक बड़ा बाजार का प्रभुत्व है, और गैर-डिफ़ॉल्ट शेल का उपयोग करने वाले किसी व्यक्ति को इस प्रश्न को पूछने की आवश्यकता नहीं है।
user1133275

6

setएक शेल बिल्डिन है , जिसका उपयोग सेट और अनसेट शेल विकल्पों और स्थितीय मापदंडों के लिए किया जाता है।

तर्कों के बिना, setसभी शेल वैरिएबल (वर्तमान सत्र में पर्यावरण चर और वैरिएबल दोनों) को प्रिंट करेंगे जो वर्तमान लोकल में क्रमबद्ध हैं ।

आप बैश डॉक्यूमेंटेशन भी पढ़ सकते हैं ।


कुछ कैवियट हैं।

set "$var"को varमान प्रदान करेगा $1। यदि इसके $varसाथ -या शुरू होता है +, तो $varसामग्री को शेल विकल्पों के अनुक्रम के रूप में माना जाता था। यदि $varकोई अमान्य विकल्प हैं, तो अधिकांश POSIX गोले त्रुटि को प्रिंट करेंगे। yashऔर zshमें sh, kshअनुकरण केवल त्रुटि मुद्रण नहीं कर रहे हैं, लेकिन यह भी मान्य विकल्प सेट। जबकि yashस्टॉप पहले अमान्य विकल्प पर विकल्प की स्थापना, zshउन सभी को आवंटित करेगा। इन yash:

var=-fxd; set "$var"

fऔर xमें पेश करेंगे $-, जबकि:

var=fdx; set "$var"

में ही fमौजूद है $-। दोनों मामलों में, fऔर में और एमुलेशन के साथ xउपस्थित होगा ।$-zshshksh

आपको उस स्थिति से बचाने के लिए, आप --पहले पैरामीटर के रूप में स्थितीय पैरामीटर सेट करने के लिए पास कर सकते हैं, यहां तक ​​कि इसके साथ शुरू -या +:

var=-fdx; set -- "$var"

आवंटित करेगा $varकरने के लिए $1भले ही उसकी सामग्री,।

set -- आगे किसी भी तर्क के बिना सभी स्थिति मापदंडों को परेशान करेगा।

यदि पहला तर्क है -, तो व्यवहार अनिर्दिष्ट है। सभी ज्ञात POSIX गोले परेशान xऔर vविकल्प (को छोड़कर posh), और स्थितिगत -मापदंडों के बाद कुछ भी असाइन करेंगे :

set -xv - -f

आवंटित करेगा -fकरने के लिए $1set -ने भी स्थितिगत मापदंडों को परेशान नहीं किया। शिल्पी ओश भी ऐसा ही व्यवहार करते हैं। हिरलूम श न परेशान vऔर xविकल्प।

एकमात्र POSIX शेल अपवाद है yash, जो -पहले स्थितीय पैरामीटर के रूप में व्यवहार करता है:

$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx

यदि -तर्क में मौजूद हो तो भी शिल्ली कुछ नहीं कर रहा है:

$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s

$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs

मैं समझता हूँ कभी नहीं क्यों लोग कहीं भी लेकिन पहले एक से लिंक होगा ... आप के बीच अलग-अलग उल्लेख करने के लिए पसंद कर सकते हैं set -- $unset, set - $unset, set $unset, और set "$unset"और इतने पर - यह आम तौर पर उन विसंगतियों कि पहली जगह में मुसीबत उस तरह का में लोगों को मिलता है।
mikeserv

@mikeserv: ठीक है, मैंने आगे के विवरण जोड़े, लेकिन मुझे यह नहीं मिला कि आप का क्या मतलब है $unset
कोउंगलम

@ cuonglm कमांड एक unset वेरिएबल के set $unsetसमान ही कार्य करेगा set। लेकिन set "$unset" ध्यान देने योग्य है, अगर unsetवास्तव में एक परेशान चर है। ए और सेट विकल्पों set - $unsetको हटाता है (बैश में)। -v-x

@BinaryZebra: आह, ज़ाहिर है, मेरे लिए, इसका उपयोग करना बेहतर है unset_var। और यह भी ध्यान दें कि set "$unset"वास्तव $1में खाली करने के लिए तैयार है। यह शेल विस्तार के बारे में है, सख्ती से नहीं set, इसलिए मैं इसका उल्लेख नहीं करता।
कोउंगलम

1
@ माइकर्स: के व्यवहार poshऔर प्रकट yashहोने पर भिन्न होते -हैं। आप मेरे अपडेट को पढ़ सकते हैं (और इसे सुधारने के लिए स्वतंत्र महसूस कर सकते हैं)।
congonglm

2

यदि आप बैश शेल के अंदर काम कर रहे हैं, तो टाइप करें help set

मुद्रित सहायता के अंत में, पढ़ें:

यदि कोई एआरजी नहीं दिया जाता है, तो सभी शेल चर मुद्रित होते हैं।

इसलिए, कोई भी तर्क setशेल में ज्ञात सभी चर प्रिंट नहीं करता है।


मुझे आश्चर्य है कि अगर set -x; setउपयोगी होगा
ILMostro_7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.