2009-06-03 9 views
5

के भीतर इंटरैक्टिव खोल का पता लगाने के लिए यह निर्धारित करने का पसंदीदा तरीका क्या है कि दिया गया Ksh आमंत्रण एक इंटरैक्टिव खोल चला रहा है या नहीं?ksh ENV स्क्रिप्ट

मेरे पास ENV फ़ाइल में कुछ आदेश हैं जो मैं गैर-इंटरैक्टिव केश इनवोकेशन (जैसे शेल स्क्रिप्ट निष्पादित करते समय) के लिए छोड़ना चाहता हूं।

मैं लेकर from सुझाव देखा है:

if [[ $- = *i* ]]; then 
    # do interactive stuff 
fi 

... यहां तक ​​कि .kshrc सोर्सिंग नहीं जब तक खोल का उपयोग करते हुए इस गुप्त incantation इंटरैक्टिव निर्धारित किया जाता है:

ENVIRON=$HOME/.kshrc         export ENVIRON 
ENV='${ENVIRON[(_$-=1)+(_=0)-(_$-!=_${-%%*i*})]}'  export ENV 

उत्तर

2

बैश में, इन दो विधियों का उपयोग अक्सर ~/.bashrc:

के अंदर किया जाता है

[ -t 0 ] || return 

या

if [ -t 0 ]; then 
    # do interactive stuff 
fi 
  • चेक अगर शीघ्र ($PS1) सेट किया गया है:

    [ -z "$PS1" ] || return 
    
  • लेकिन मैं 0

    • यदि चेक stdin एक tty है पता नहीं कैसे करना है किश में।

    +0

    '-टी एन' परीक्षण भी कॉर्न शेल में काम करते हैं। –

    +1

    '-t एन' निश्चित है? क्या ऐसे मामले हैं जहां यह '$ - = * i *' से अलग है? –

    +0

    'test -t 0' परीक्षण के लिए है, चाहे 'stdin' टर्मिनल है। यह वैसा ही नहीं है कि शैल इंटरैक्टिव है या नहीं। आप एक शेल-स्क्रिप्ट चला सकते हैं, उदाहरण के लिए, tty से पढ़ना। –

    4

    मुझे 'i' ध्वज के लिए $ - चर का उपयोग करने के लिए ksh में सबसे अच्छी विधि की जांच मिली है।

    if [[ $- = *i* ]]; then 
        #do interactive stuff  
    fi 
    
    0

    इसकी भी संभव 'tty -s' का उपयोग करने के लिए:

    The following exit values are returned: 
    
        0  Standard input is a terminal. 
    
        1  Standard input is not a terminal. 
    
    0

    एक उचित KSH खोल $ ENV आह्वान नहीं करना चाहिए जब एक स्क्रिप्ट चलाने। हालांकि, यह सूर्य की ksh88 बोली में एक लंबी उपस्थिति बग रही है, और वास्तव में सोलारिस 10 में देर से पैच किया गया था। (काफी आश्चर्य की बात है, क्योंकि सूर्य पारंपरिक रूप से मौजूदा व्यवहार को बदलने में बहुत अनिच्छुक था, क्योंकि इस तरह के फिक्स कामकाज तोड़ सकते थे। इस मामले में मानक प्रबल।)

    सूर्य के ksh88 को एक स्क्रिप्ट चलाने पर $ ENV पढ़ने के लिए रोकने के लिए, #!/bin/ksh -p वर्कअराउंड का उपयोग करना आम था, और अगर आपके पास /etc/suid_profile लटक रहा था तो सुरक्षित था।

    हालांकि, $ - एक इंटरैक्टिव खोल का विश्वसनीय संकेतक है, जब तक कि आप इसे नकली न करें।

    $ cat interactive.sh 
    echo \$- = $- 
    [[ $- == *i* ]] && echo interactive || echo not interactive 
    

    जब एक स्क्रिप्ट के रूप में चलाने इस देता है:

    $ ksh interactive.sh 
    $- = hB 
    not interactive 
    

    जब हम नकली -i झंडा, आपको मिल क्या आप के लिए पूछना:

    $ ksh -i interactive.sh 
    $- = imBE 
    interactive 
    

    और जब एक इंटरैक्टिव खोल से प्राप्त , यह सही काम करेगा:

    $ . ./interactive.sh 
    $- = imsBEl 
    interactive 
    
    संबंधित मुद्दे