Creo que entiendo las diferencias entre un shell interactivo, un inicio de sesión y un lote. Consulte los siguientes enlaces para obtener más ayuda:
- ¿Cuál es la diferencia entre un bash shell 'Login' y un 'Interactive' (del sitio hermano: serverfault.com )
- 2.1: Tipos de shell: shells interactivos y de inicio de sesión (de la Guía del usuario de Z-Shell )
Mi pregunta es, ¿cómo puedo probar con un comando / condición si estoy en un shell interactivo, de inicio de sesión o por lotes?
Estoy buscando un comando o condición (que devuelve true
o false
) y que también podría colocar en una declaración if. Por ejemplo:
if [[ condition ]]
echo "This is a login shell"
fi
Respuestas:
Asumo un
bash
shell, o similar, ya que no hay un shell en las etiquetas.Para verificar si está en un shell interactivo:
Para verificar si está en un shell de inicio de sesión:
Por "lote", supongo que quiere decir "no interactivo", por lo que la comprobación de un shell interactivo debería ser suficiente.
fuente
zsh
usuarios, la comprobación de un shell de inicio de sesión se puede hacer con:if [[ -o login ]] ...
$-
se está expandiendo en el shell actual. Si usa comillas simples alrededor de la expresión completa obtendrá el resultado correcto:bash -c '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"'
En cualquier shell de estilo Bourne, la
i
opción indica si el shell es interactivo:No hay una forma portátil y totalmente confiable de probar un shell de inicio de sesión. Ksh y zsh se suman
l
a$-
. Bash establece lalogin_shell
opción, con la que puede consultarshopt -q login_shell
. Portablemente, pruebe si$0
comienza con a-
: los shells normalmente saben que son shells de inicio de sesión porque la persona que llama agregó un-
prefijo al argumento cero (normalmente el nombre o la ruta del ejecutable). Esto no puede detectar formas específicas de shell de invocar un shell de inicio de sesión (por ejemploash -l
).fuente
$0
siempre comienza con un-
no importa cómo se inició. Pero hay al menos una excepción: esto no siempre es cierto con bash, incluso si se supone que es un shell de inicio de sesión. Pruébelo en su caja: invocarbash --login
, luego$0
sigue leyendobash
.concha de pescado
Aquí está la respuesta
fish
en caso de que otros usuarios se encuentren con esta página.Documentación de pescado: inicialización
fuente
csh / tcsh
Para
csh
ytcsh
tengo lo siguiente en mi.cshrc
archivo:Específicamente para
tcsh
, la variableloginsh
se establece para un shell de inicio de sesión:(
tcsh
también tiene una variableshlvl
que se establece en el número de shells anidados, donde el shell de inicio de sesión tiene un valor de 1.)fuente
PS1
no funciona para probar un shell interactivo. Casi siempre se configura de forma interactiva, pero puede desactivarlo. Es muy a menudo situado en una cáscara no interactivo, ya que muchos sistemas de la nave conexport PS
en/etc/profile
.Otra forma es verificar el resultado de
tty
fuente
[ -t 0 ]
para probar si STDIN es un tty. También puede usar 1 (STDOUT) o 2 (STDERR) según sus necesidades.disown
vivo,tty
funcionó mejor para saber que ya no es interactivo, mientras$-
que no cambió; Todavía estoy desconcertado sobre cuál es el mejor enfoque.[ -t 0 ]
. PD: En mi comentario anterior, escribí que "hay una fuerte correlación": se me olvidó "aparte del caso extremadamente común de un script iniciado con#!/bin/sh
o similar", que no es interactivo pero se puede conectar a un terminal.UNIX / Linux tiene un comando para verificar si está en una terminal.
fuente
dash
también en .Puede verificar si stdin es una terminal:
fuente
Para verificar si un script se ejecuta en un shell interactivo o no interactivo, verifico en mis scripts la presencia de un indicador almacenado en la
$PS1
variable:Esto lo aprendí aquí: https://www.tldp.org/LDP/abs/html/intandnonint.html
fuente
i
No es la opción correcta a buscar.-i
es forzar un shell que de otro modo no sería interactivo a ser interactivo. La opción correcta habilitada automáticamente es-s
, pero Bash desafortunadamente no maneja esto correctamente.Debe verificar si
$-
contienes
(se garantiza que se activará automáticamente) o si contienei
(no se garantiza que se active automáticamente, sino que oficialmente solo se acopla a la-i
opción de línea de comandos del shell).fuente
s
sería si el shell lee comandos de stdin, no si es interactivo. Un shell interactivo no necesariamente lee los comandos de stdin (intentezsh -i < /dev/null
, aunque zsh parece ser la excepción aquí). Y un shell puede estar leyendo comandos de stdin y no ser interactivo (comosh < file
oecho 'echo "$1"' | sh -s foo bar
).[[...]]
que implica ksh / bash / zsh. Tienes un punto como una nota de la historia que la comprobación dei
en$-
no funcionará en el shell Bourne. Pero entonces verificars
tampoco funcionará allí de manera confiable. También querrá verificar[ -t 0 ]
oi
; incluso entonces eso sería engañado en casos de esquina comoecho 'exec < /dev/tty; that-check' | sh'