मैं वर्तमान शेल के लिए बैश के विकल्प कैसे सूचीबद्ध कर सकता हूं?


27

बैश इंट्राप्टर में ही विकल्प हैं, यानी

बैश के मैन पेज की लाइन्स 22-23:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  

मैंने बैश मैन पेज में कुछ खोज पैटर्न का उपयोग किया है:

  • /^\s*set
  • /list

क्या वर्तमान शेल पर लागू होने वाली इन सेटिंग्स की सूची को प्रिंट करना संभव है?

जवाबों:


26
printf %s\\n "$-"

एकल स्ट्रिंग में एकल अक्षर विकल्पों को सूचीबद्ध करेगा।

उस पैरामीटर का भी उपयोग किया जा सकता है:

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

पहली बार शेल -filename विस्तार को अक्षम करने के लिए , साथ ही साथ $-- यदि कोई हो - के लिए मान को सहेजते हुए $1। अगला, कोई +fग्लब्स नहीं होता है, और अंतिम ilename विस्तार एक बार फिर से सक्षम है, और संभवतः अक्षम भी।

उदाहरण के लिए, यदि -fपहले से ही $-सहेजे गए मान के लिए ilename का विस्तार पहले से ही अक्षम था, तो उसका सहेजा गया मान होगा (कम से कम) :

f

और इसलिए जब setफिर से चलाया जाता है, तो यह काम करता है:

set +f -f

जो आपको अभी वापस वहीं डालता है जहां आपने शुरू किया था।

set +o

सभी setटेबल शेल विकल्पों को सूचीबद्ध करेंगे ( सक्षम के लिए जेसन का जवाब देखें shopt- क्या यह एक शब्द है? - विकल्प) एक रूप में जो शेल रीएंट्री के लिए सुरक्षित है। इस तरह से, आप यह भी कर सकते हैं:

state=$(set +o)
set -some -crazy -options
eval "$state"

शेल विकल्पों की स्थिति को क्रमशः सहेजने, बदलने और पुनर्स्थापित करने के लिए।

एक बार में shoptआयनों और setटेबल विकल्पों को संभालने के लिए :

state=$(set +o;shopt)
#do what you want with options here
eval "$state"

आप शेल के सभी वर्तमान में सेट किए गए चर की सूची को जोड़ने के लिए किसी भी तर्क के set बिना भी कॉल कर सकते हैं - शेल के लिए पुनरावृत्ति के लिए उद्धृत भी। और आप कर सकते हैं - पार्टी की योजना में - इसके अलावा कमांड typeset -fpको भी वर्तमान में घोषित सभी शेल कार्यों में शामिल करें। आप यह सब एक साथ गांठ कर सकते हैं और evalतैयार होने पर। तुम भी aliasअधिक के लिए तर्कों के बिना कॉल कर सकते हैं । हालांकि ... यह इसे कवर कर सकता है, हालांकि। मुझे लगता है कि वहाँ है "$@"- जो आपको bashपहले एक सरणी में रखना होगा , मुझे लगता है, करने से पहले set

नहीं, वहाँ भी है trap। यह थोड़ा मजाकिया है। आम तौर पर:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

... बस प्रिंट करेंगे यह मेरा सबस्क्रिप्शन है क्योंकि सबस्क्रिप्शन एक नई प्रक्रिया है और इसका अपना सेट मिलता है trap- और इसलिए किसी भी trapएस को इनहेरिट नहीं किया जाता है, लेकिन जिन्हें इसके माता-पिता ने स्पष्ट रूप से अनदेखा किया है - (जैसे trap '' INT)

तथापि:

trap 'echo this is my trap' 0
save_traps=$(trap)

trapविशेष रूप से तब व्यवहार करता है जब यह कमांड सबस्टेशन में पहला और एकमात्र कमांड रन होता है जो इस प्रकार उप-भाग में होता है कि यह वर्तमान trapsमें एक प्रारूप में सेट किए गए पैरेंट शेल की सूची को पुन: पेश करेगा जो शेल के लिए सुरक्षित पुनरावृत्ति के लिए उद्धृत है। और इसलिए आप कर सकते हैं save_traps, तो set बिना तर्क के - और बाकी सभी पहले से ही उल्लेख किया गया है - बहुत ज्यादा सभी खोल राज्य पर ताला पाने के लिए। आप मूल शेल संस्करण विशेषताओं को स्पष्ट रूप से जोड़ना export -pऔर readonly -pपुनर्स्थापित करना चाह सकते हैं , हालांकि।

वैसे भी, यह काफी है।


धन्यवाद, आपका कोड अच्छी तरह से काम करता है। इसलिए सभी विकल्पों की पूरी सूची प्राप्त करने के लिए, आपको दोनों का उपयोग करना होगा set +o और shopt ? (जैसा कि shoptएक शब्द होने में सक्षम है, settableमैन पेज में उपयोग किया जाता है, इसलिए shoptableमेरे लिए काम करता है)
the_velour_fog

@ user4668401 - मुझे लगता है कि यह कर देगा।
चाटुकार

TL, DR, लेकिन एक विकल्प को बदलने के लिए 3 लाइनों के समाधान के लिए +1000 और इसे 'जैसा था' वापस रख दिया। स्क्रिप्ट या कॉपी / पेस्ट करने योग्य निर्देशों को बनाते समय ठीक उसी तरह की जरूरत होती है।
बाल्मीपुर

@mikeserv लगता है कि -p विकल्प को जोड़ने की जरूरत है जब राज्य को बचाने के लिए shoptआयनों को शामिल किया जाना चाहिए ,state=$(set +o;shopt -p)
nkatsar

9

से manपेज:

shopt
... कोई विकल्प नहीं, या -p विकल्प के साथ, सभी सेट करने योग्य विकल्पों की एक सूची प्रदर्शित की जाती है, जिसमें प्रत्येक के सेट होने या न होने का संकेत होता है।
shopt | grep on

सभी सक्षम विकल्पों की सूची प्रिंट करेगा।


काम किया, धन्यवाद। क्या आप जानते हैं कि क्या यह उन विकल्पों को सूचीबद्ध करता है जो दोनों द्वारा तय किए गए हैं setऔर shopt?
the_velour_fog

@ user4668401 नहीं, setकहीं अधिक व्यापक है: मैन पेज प्रविष्टि देखें
जसोनव्रीयन

और यह जांचने के लिए कि क्या कोई एकल विकल्प चालू है:shopt <option>
कोस

इसमें नाम (यानी huponexit) में 'ऑन' के साथ ऑप्स शामिल होंगे । ठीक करने का सरल तरीका हैshopt | grep on$
माइक डी

6

सभी विकल्पों को सूचीबद्ध करने के लिए:

set -o

एक विशिष्ट विकल्प का निरीक्षण करने के लिए:

set -o | grep <OPTION>

verboseउदाहरण के रूप में विकल्प लें :

$ set -o | grep verbose
verbose         off

6

विकल्प ?: बैश में विकल्पों के तीन समूह हैं।

  1. कमांड द्वारा पढ़े या सेट किए गए विकल्प set
    (मैनुअल के लिए इस आदेश का उपयोग करें: LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash)
    सभी एक अक्षर का विकल्प:abefhkmnptuvxBCEHPT

    इसके अलावा विकल्प (जिसमें कोई एकल अक्षर समतुल्य नहीं है):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. कमांड द्वारा पढ़े या सेट किए गए विकल्प shopt
    (इस आदेश के साथ मैनुअल पढ़ें: LESS=+/'shopt \[-pqsu\]' man bash')
    सूची काफी लंबी, लेकिन आसान मुद्रित करने के लिए, इस्तेमाल होता है:

    $ shopt -p

    या समान (लेकिन बराबर नहीं):

    $ shopt
  3. विकल्प मंगलाचरण पर सेट किया जा सकता है:
    (आदेश के मैनुअल के लिए: LESS=+/'^INVOCATION' man bash)

    सभी setविकल्प:

    bash -abefhkmnptuvxBCEHPT

    सभी shoptविकल्प

    bash -O option

    कुछ विकल्प जो केवल तभी सार्थक होते हैं जब निवेश बैश:

    bash -lirsDc

    और, यह भी (लंबे विकल्प):

    bash --debugger --help --init-file file --rcfile file --login \
         --noediting --noprofile --norc --posix --restricted \
         --verbose --version

सभी setएक अक्षर विकल्प और के -riसाथ मुद्रित होते हैं $-

-i      Interactive  
Only read with `$-` (if it contains an `i`).
-r      Restricted
Also read with `shopt -p restricted_shell

उदाहरण के लिए:

$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri

बैश को एक लॉगिन शेल के रूप में कॉल करना केवल शॉप के साथ सूचित किया जाता है:

-l      Login
read with `shopt -p login_shell`

इस प्रकार:

$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell

विकल्प -nको किसी भी कोड द्वारा परीक्षण नहीं किया जा सकता है, क्योंकि इसका मतलब है: किसी भी कोड को निष्पादित न करें।


मुद्रण विकल्प

रनिंग शेल के विकल्पों को सूचीबद्ध करने के लिए सबसे अच्छा उपकरण , या तो जिनके साथ सेट किया गया है setया जिनके साथ सेट shoptहै, वही है shopt। सेट विकल्पों की सूची के लिए:

shopt -o

जो बिल्कुल के रूप में कार्य करता है set -o। के shopt -poरूप में एक ही परिणाम प्राप्त करने के लिए उपयोग करें set +o

दुकान विकल्पों की सूची के लिए:

shopt -p

जिनमें से आप सेट shopt -psया अनसेट में से किसी एक को प्रिंट करना चुन सकते हैंshopt -pu

सभी विकल्प प्राप्त करने के लिए। जितना संभव हो सके उतने लंबे विकल्प और कुछ ( -sDc) पर चालान मुद्रित नहीं किया जा सकता है:

$ echo $-; shopt -p ; shopt -po

उन्हें एक चर में संग्रहीत करने के लिए:

$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"

और चर का उपयोग सभी विकल्पों को वापस सेट करने के लिए किया जा सकता है:

$ eval "$storeoptions"

1

एक विशिष्ट विकल्प का निरीक्षण करने के लिए:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.