2009-06-03 12 views
5

Quelle est la méthode préférée pour déterminer si un appel ksh donné exécute un shell interactif?Détection du shell interactif dans le script ENV de ksh

J'ai quelques commandes dans un fichier ENV que je voudrais ignorer pour les invocations ksh non interactives (par exemple lors de l'exécution d'un script shell).

que j'ai vu suggérer allant from:

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

... à ne pas approvisionner même .kshrc à moins que le shell est déterminé à être interactif utilisant ce cryptique incantation:

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

Répondre

2

En bash, ces deux méthodes sont souvent utilisées à l'intérieur ~/.bashrc:

  • Vérifiez si stdin est un TTY:

    [ -t 0 ] || return 
    

    ou

    if [ -t 0 ]; then 
        # do interactive stuff 
    fi 
    
  • Vérifiez si l'invite ($PS1) est définie:

    [ -z "$PS1" ] || return 
    

Mais je je ne sais pas comment faire cela dans ksh.

+0

Les tests '-t N' fonctionnent aussi dans le shell Korn. –

+1

Est-ce que '-t N' est définitif? Y a-t-il des cas où il diffère de '$ - = * i *'? –

+0

'test -t 0' est à tester, si' stdin' est un terminal. Ce n'est pas la même chose que si le shell est interactif. Vous pourriez lancer un shell-script, par exemple, en lisant à partir de tty. –

4

J'ai trouvé la vérification de la variable $ - pour le drapeau 'i' la meilleure méthode dans ksh.

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

Il est aussi possible d'utiliser 'TTY -s':

The following exit values are returned: 

    0  Standard input is a terminal. 

    1  Standard input is not a terminal. 
0

Une carapace KSH ne devrait pas invoquer ENV $ lors de l'exécution d'un script. Cependant, cela a été un bug de longue date dans le dialecte ksh88 de Sun, et a été corrigé tard dans Solaris 10. (Assez surprise, car Sun était traditionnellement très réticent à changer le comportement existant, parce que de tels correctifs pouvaient casser des solutions de contournement. Pour éviter que ksh88 de sun ne lise $ ENV lors de l'exécution d'un script, il était courant d'utiliser la solution de contournement #!/bin/ksh -p, et il était sûr si vous n'aviez pas de /etc/suid_profile en train de traîner.

Cependant, $ - est un indicateur fiable d'un shell interactif, à moins que vous le fassiez.

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

Lorsqu'il est exécuté comme un script ce qui donne:

$ ksh interactive.sh 
$- = hB 
not interactive 

Lorsque nous faux drapeau -i, vous obtenez ce que vous demandez:

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

Et provenant d'un shell interactif , il fera la bonne chose:

$ . ./interactive.sh 
$- = imsBEl 
interactive 
Questions connexes