मेरी स्क्रिप्ट यह कैसे निर्धारित कर सकती है कि यह बैश या डैश द्वारा चलाया जा रहा है?


13

मैं दो अलग-अलग प्रणालियों पर एक ताजा Oneiric इंस्टॉल (यानी अपग्रेड नहीं) चला रहा हूं और समान रूप से संबंधित समस्याओं के सेट में चल रहा हूं।

गुच्छा का सबसे निराशाजनक यह है कि, जब मैं मैक ओएस एक्स से मेरे साथ किए गए .profile और .bashrc का उपयोग करता हूं, तो लाइटडीडीएम के माध्यम से एक्स में लॉगिंग मुझे तुरंत लॉग आउट करता है। मेरा मानना ​​है कि यह इस तथ्य के कारण है कि, "/ बिन / श" को चलाने पर, यह / बिन / डैश के रूप में व्यवहार करता है, लेकिन अभी भी $ SHELL चर / बिन / बैश पर सेट है।

एक्सट्रपलेशन

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

मेरा .profileलुक ऐसा है (संक्षिप्त):

case $SHELL in 
*bash*)
    if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
        . $HOME/.bashrc
    fi
    ;;
esac

अगर मैं LightDM के माध्यम से X में लॉग इन करने का प्रयास करता हूं, तो यह मुझे तुरंत वापस लॉग आउट कर देगा। मुझे .xsession-errorsअपने .bashrc से संबंधित त्रुटियां मिलती हैं जो इस तरह दिखाई देती हैं (संक्षिप्त):

/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found

जैसा कि मैंने कहा, जब मैं एक वर्चुअल कंसोल से बैश चलाता हूं, तो मुझे ये त्रुटियां नहीं मिलती हैं। इसके अलावा, अगर मैं अपने .profile को हटाता हूं, तो मैं X में ठीक लॉग इन कर सकता हूं। (मैं एक वर्चुअल कंसोल में भी लॉग इन कर सकता हूं और startxकाम करने वाले X सत्र को आरंभ करने के लिए उपयोग कर सकता हूं , लेकिन यह निश्चित रूप से एक लंबा समाधान नहीं है।)

हालांकि, मुझे पता चला है कि अगर मैं चलाने /bin/sh -l, मैं करते त्रुटियों मिलता है। यहाँ एक उदाहरण सत्र है (ध्यान दें: bash prompt मैंने सरल किया है bash>, और sh प्रॉम्प्ट बस है $):

bash> echo $SHELL
/bin/bash
bash> echo $BASH_VERSION
4.2.10(1)-release
bash> /bin/sh -l
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION

$

Q1: ऐसा क्यों हो रहा है?

मैं समझता / समझती हूं कि बिन / श अब बश के बजाय पानी का छींटा मारने की ओर इशारा करता है , लेकिन अगर यह सच है, तो $SHELLअभी भी क्यों लौट रहा है /bin/bash?

Q2: मैं इसके आसपास काम करने के लिए क्या कर सकता हूं?

क्या इसके आसपास काम करने का कोई तरीका है? मैं अपनी प्रोफ़ाइल लोडिंग रखना चाहता हूं .Bashrc ताकि मुझे लॉगिन और नॉन-लॉगिन दोनों गोले पर समान वातावरण मिले, लेकिन जाहिर है कि मैं केवल इसे बैश के लिए लोड करना चाहता हूं, न कि बिन / श मास्किंग को बैश के रूप में।

आपने ऊपर BASH_VERSION चर की सामग्री में अंतर देखा होगा। मैंने कुछ इस तरह से अपने .profile को लपेटने की कोशिश की है:

if [ -n $BASH_VERSION ]; then
    # the rest of my .profile as above
fi

-nपरीक्षण से ऊपर सत्र में सच लौट जाना ही अगर स्ट्रिंग की लंबाई गैर-शून्य है, फिर भी, भले ही, जब मैं चल रहा हूँ के तहत /bin/sh -lयह $ BASH_VERSION के लिए एक खाली स्ट्रिंग, जब यह इस तरह मेरी .profile में शामिल है रिटर्न , यह परीक्षा पास करता है! यह उन्हें मेरे .bashrc स्रोत के लिए आगे बढ़ाता है और मुझे पहले जैसी त्रुटियां देता है।

अब मैं वास्तव में उलझन में हूँ ।


ध्यान दें कि मूल्य dash -lभी दर्शाता है । $SHELL/bin/bash
स्कॉट सेवेरेंस

3
$SHELL/etc/passwd(या getent passwd) में अंतिम क्षेत्र जो भी हो ।
अगली सूचना तक रोक दिया गया।

@DennisWilliamson धन्यवाद , यही मुझे सही उत्तर खोजने के लिए जानने की आवश्यकता थी।
मीका आर लेडबेट्टर

आप यह गलत कर रहे है। आपको गैर-बैश-विशिष्ट वातावरण में ~/.profile, बैश-विशिष्ट चीजों को अंदर रखना चाहिए ~/.bashrcऔर ~/.bash_profileदोनों को स्रोत होना चाहिए ।
nyuszika7h

जवाबों:


12

आप इस बात को सच कर सकते हैं कि आपके लिए काम $BASH_VERSIONखाली है dash:

if [ "$BASH_VERSION" = '' ]; then
    echo "This is dash."
else
    echo "This is bash."
fi

2
"एक्स" तकनीक पुरातन है और केवल प्राचीन गोले में आवश्यक है । उपयोग करेंif [ "$BASH_VERSION" = '' ]
अगली सूचना तक रोक दिया गया।

@ डेनिसविलियम्सन: धन्यवाद। मैंने सोचा था कि आपकी तकनीक बैश के लिए विशिष्ट थी, लेकिन मैंने इसे डैश में आराम दिया और यह काम किया। मैंने अपना उत्तर संपादित कर दिया है।
स्कॉट सेवेरेंस

या सिर्फ उपयोग-n , या कुछ भी नहीं । (+1, हालांकि = ''पूरी तरह से अच्छी तरह से काम करता है।)
एलियाह कगन

5

आपको बस चर पर उद्धरण चिह्नों BASH_VERSIONका उपयोग करना है-n

if [ -n "$BASH_VERSION" ];then
 echo "this is bash"; 
else 
 echo "this is dash";
fi

1
चूंकि [ "$EMPTY_STRING" ]झूठ का मूल्यांकन किया जाता है, आपको इसकी आवश्यकता भी नहीं है -n। आपको बस वेरिएबल को कोट करना है।
जेबरल

2

/proc/[PID]/cmdlineयह देखने के लिए उपयोग करें कि स्क्रिप्ट क्या चल रही है और इसमें क्या है, इसके लिए परीक्षण करें। $$चर हमें चल खोल के पीआईडी दे देंगे। इस प्रकार हम इस तरह से एक स्क्रिप्ट बना सकते हैं,

#!/bin/bash
if grep -q 'bash' /proc/$$/cmdline ;
then
    echo "This is bash"
else
    echo "This is some other shell"
fi

यहाँ एक ही स्क्रिप्ट का परीक्षण है:

$> bash test_script.sh                                                                                                
This is bash
$> dash test_script.sh                                                                                                
This is some other shell

यह मैक पर काम नहीं करेगा। $ BASH_VERSION की जाँच करें।
ऑस्टिन बर्क

2
@ ऑस्ट्रेलिया इसे मैक पर काम करने की जरूरत नहीं है। यह पूछ उबंटू है।
द वेंडर

@ Zacharee1 ओह यह, मैं ध्यान नहीं दे रहा था:)
ऑस्टिन बर्क

मैं इसे दूर नहीं करना चाहता जिसे आप चाहते हैं, लेकिन मैं इस पद्धति की सीमाओं का उल्लेख करने का सुझाव देता हूं। bashइसके नाम में बैश की जरूरत नहीं है ; bashनिष्पादन योग्य के लिए किसी अन्य नाम के साथ सिमलिंक के माध्यम से चलाया जाना असामान्य नहीं है । आमतौर पर कोई भी उस बैश पर विचार करना चाहेगा। इसके अलावा, पैटर्न को कहीं भी मिलान किया जाता है/proc/$$/cmdline , जिसे ठीक करना संभव होना चाहिए, लेकिन ध्यान रखें कि तर्क cmdlineअशक्त हैं। grep -qE '(^|/)bash$'ऐसा लगता है कि यह काम करना चाहिए लेकिन किसी भी तर्क के होने पर एक गलत सकारात्मक देता है bash
एलियाह कगन

@EliahKagan किसी भी समय मेरे उत्तरों को संपादित करने के लिए स्वतंत्र महसूस करें - आपके पास पर्याप्त विशेषज्ञता है इसलिए मुझे पता है कि आपके संपादन केवल सुधार की पेशकश कर सकते हैं। जवाब में लिखा गया था कि जब मैं अभी की तुलना में गोले के साथ बहुत हरियाली थी।
सेर्गेई कोलोडियाज़नी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.