2009-06-03 17 views
5

¿Cuál es la forma preferida de determinar si una invocación de ksh determinada está ejecutando un shell interactivo?Detección de shell interactivo dentro de la secuencia de comandos ksh ENV

Tengo algunos comandos en un archivo ENV que me gustaría omitir para invocaciones ksh no interactivas (por ejemplo, al ejecutar un script de shell).

que he visto lo que sugiere que van from:

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

... que ni siquiera abastecimiento .kshrc menos que el depósito se determina que es interactiva usando este críptico incantation:

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

Respuesta

2

En fiesta, estos dos métodos se utilizan a menudo dentro de ~/.bashrc:

  • Comprobar si stdin es un TTY:

    [ -t 0 ] || return 
    

    o

    if [ -t 0 ]; then 
        # do interactive stuff 
    fi 
    
  • Compruebe si el indicador ($PS1) se establece:

    [ -z "$PS1" ] || return 
    

Pero no sé cómo hacer eso en ksh.

+0

Las pruebas '-t N' también funcionan en el shell Korn. –

+1

¿Es '-t N' definitivo? ¿Hay casos en los que difiere de '$ - = * i *'? –

+0

'test -t 0' es para probar, si' stdin' es un terminal. Eso no es lo mismo que si el shell es interactivo. Puede ejecutar un script de shell, por ejemplo, leyendo de tty. –

4

He encontrado la comprobación de la variable $ - para la marca 'i' el mejor método en ksh.

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

Su también es posible utilizar 'tty -s':

The following exit values are returned: 

    0  Standard input is a terminal. 

    1  Standard input is not a terminal. 
0

Una concha adecuada KSH no invocar $ ENV cuando se ejecuta una secuencia de comandos. Sin embargo, este ha sido un error largo presente en el dialecto ksh88 de Sun, y en realidad fue parchado tarde en Solaris 10. (Fue una sorpresa, ya que Sun tradicionalmente era muy reacio a cambiar el comportamiento existente, porque tales soluciones podían romper soluciones). estándar prevaleció.)

para evitar ksh88 del sol para leer $ ENV sobre la ejecución de un script, era común utilizar la solución #!/bin/ksh -p, y estaba segura si no tiene una /etc/suid_profile dando vueltas.

Sin embargo, $ - es un indicador confiable de un shell interactivo, a menos que lo falsifique.

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

Cuando se realiza según un guión esto da:

$ ksh interactive.sh 
$- = hB 
not interactive 

Cuando falsa la bandera -i, se obtiene lo que pide:

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

Y cuando proceden de un shell interactivo , hará lo correcto:

$ . ./interactive.sh 
$- = imsBEl 
interactive 
Cuestiones relacionadas