Como verificar se um shell é login / interactive / batch

123

Acho que entendo as diferenças entre um shell interativo, um login e um batch. Veja os links a seguir para mais ajuda:

A minha pergunta é, como posso testar com um comando / condição se eu estiver em um shell interativo, um login ou um batch?

Estou procurando um comando ou condição (que retorna true ou false ) e que eu também poderia colocar em uma instrução if. Por exemplo:

if [[ condition ]]
   echo "This is a login shell"
fi
    
por Amelio Vazquez-Reina 13.12.2011 / 02:31

10 respostas

137

Estou assumindo um bash shell, ou similar, já que não há shell listado nas tags.

Para verificar se você está em um shell interativo:

[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'

Para verificar se você está em um shell de login:

shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'

Por "lote", suponho que você quer dizer "não interativo", portanto, a verificação de um shell interativo deve ser suficiente.

    
por 14.12.2011 / 00:19
28

Em qualquer shell do estilo Bourne, a opção i indica se o shell é interativo:

case $- in
  *i*) echo "This shell is interactive";;
  *) echo "This is a script";;
esac

Não há uma maneira totalmente confiável e portátil de testar um shell de login. Ksh e zsh adicionam l a $- . Bash define a opção login_shell , que você pode consultar com shopt -q login_shell . Portavelmente, teste se $0 começa com - : os shells normalmente sabem que são shells de login porque o chamador adicionou um - ao argumento zero (normalmente o nome ou caminho do executável). Isso não detecta maneiras específicas de shell de invocar um shell de login (por exemplo, ash -l ).

    
por 14.12.2011 / 12:12
22

casca de peixe

Aqui está a resposta para fish no caso de qualquer outro usuário tropeçar nesta página.

if status --is-interactive
    # ...
end

if status --is-login
    # ...
end

echo "darn, I really wanted to have to use globs or at least a case statement"

Documentação do Fish: inicialização

    
por 20.08.2015 / 08:05
16

csh / tcsh

Para csh e tcsh , tenho o seguinte no meu arquivo .cshrc :

if($?prompt) then               # Only interactive shells set $prompt
    ...
endif

Especificamente para tcsh , a variável loginsh é definida para um shell de login:

if($?loginsh) then              # A login shell..
    ...
endif

( tcsh também tem uma variável shlvl que é definida para o número de shells aninhados, onde o shell de login tem um valor de 1.)

    
por 13.12.2011 / 04:25
13

Outra maneira é verificar o resultado de tty

if [ "'tty'" != "not a tty" ]; then
    
por 13.12.2011 / 05:30
6

O UNIX / Linux tem um comando para verificar se você está em um terminal.

if tty -s
then
echo Terminal
else
echo Not on a terminal
fi
    
por 06.01.2016 / 14:34
6

Você pode verificar se stdin está disponível:

if [ -t 0 ]
then
echo "Hit enter"
read ans
fi
    
por 19.01.2016 / 02:25
1

Dê uma olhada no comando shopt (pelo menos para o Bash). Isso pode definitivamente dizer se você está em um shell de login. Eu não sei sobre interativo / lote.

Referência:

Procure na página de manual do Bash mais informações: link

Nota: Eu estou te dando Bash, já que é o que eu sei. Presumivelmente, outros shells têm funcionalidade semelhante.

    
por 13.12.2011 / 02:52
1

Para verificar se um script é executado em um shell interativo ou não interativo, Eu verifico em meus scripts a presença de um prompt armazenado na variável $PS1 :

if [ -z $PS1 ] # no prompt?
### if [ -v PS1 ]   # On Bash 4.2+ ...
then
  # non-interactive
  ...
else
  # interactive
  ...
fi

Isso eu aprendi aqui: link

    
por 15.03.2018 / 20:50
0

i não é a opção correta para procurar. -i é forçar um caso contrário shell não interativo para se tornar interativo. O correto ativado automaticamente a opção é -s , mas o Bash infelizmente não lida com isso corretamente.

Você precisa verificar se $- contém s (isso é concedido para ser ativado automaticamente) ou se contém i (isso não é concedido ser auto-ativado, mas oficialmente apenas acoplado à linha de comando -i opção do shell).

    
por 25.06.2015 / 11:43

Tags