Обнаружение интерактивной оболочки в сценарии ksh ENV - PullRequest
5 голосов
/ 03 июня 2009

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

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

Я видел, предлагая в диапазоне от :

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

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

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

Ответы [ 4 ]

4 голосов
/ 22 июля 2011

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

if [[ $- = *i* ]]; then
    #do interactive stuff     
fi
2 голосов
/ 03 июня 2009

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

  • Проверьте, является ли stdin tty:

    [ -t 0 ] || return
    

    или

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

    [ -z "$PS1" ] || return
    

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

0 голосов
/ 07 сентября 2012

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

Чтобы запретить sun 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
0 голосов
/ 13 июня 2012

Также можно использовать 'tty -s':

The following exit values are returned:

  0        Standard input is a terminal.

  1        Standard input is not a terminal.
...