2009-06-03 3 views
5

Каков предпочтительный способ определить, работает ли данный вызов ksh в интерактивной оболочке?Обнаружение интерактивной оболочки в скрипте ksh ENV

У меня есть некоторые команды в файле ENV, который я бы хотел пропустить для неинтерактивных вызовов ksh (например, при выполнении сценария оболочки).

Я видел предлагая в пределах from:

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

... даже не .kshrc поиске, если оболочка не будет определено быть интерактивным, используя этот загадочный incantation:

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

ответ

2

В Баш, эти два метода часто используются внутри ~/.bashrc:

  • Проверьте stdin является терминал:

    [ -t 0 ] || return 
    

    или

    if [ -t 0 ]; then 
        # do interactive stuff 
    fi 
    
  • Проверьте приглашение ($PS1) устанавливается:

    [ -z "$PS1" ] || return 
    

Но я не знаю, как это сделать что в кш.

+0

Тесты «-t N» также работают в оболочке Korn. –

+1

Является ли '-t N' окончательным? Существуют ли случаи, когда он отличается от «$ - = * i *»? –

+0

'test -t 0' предназначен для тестирования, является ли' stdin' терминалом. Это не то же самое, что интерактивная оболочка. Вы можете запустить shell-скрипт, например, чтение из tty. –

4

Я нашел проверку $-переменной для флага «i» лучшим методом в ksh.

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

Его также можно использовать 'терминал -s':

The following exit values are returned: 

    0  Standard input is a terminal. 

    1  Standard input is not a terminal. 
0

Надлежащей оболочку КШ не должен вызывать $ ENV при выполнении сценария. Тем не менее, это была длинная настоящая ошибка в диалекте Sun ksh88 и была фактически исправлена ​​в конце Solaris 10. (Совершенно неожиданно, поскольку Sun традиционно очень неохотно меняла существующее поведение, поскольку такие исправления могут нарушать обходные пути. стандарт был превалирован.)

Чтобы избежать использования kw88 в kw88 для чтения $ 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 
Смежные вопросы