Como eu detectaria um shell de não-login? (Em Zsh)

4

Eu quero criar um script que seja executado quando uma instância Zsh for iniciada, mas somente se a instância for:

  • Não login.
  • Interativo

Acho que estou certo em dizer que .zshrc é executado para todas as instâncias do shell interativo, .zprofile e .zlogin são executados para todos os shells de login e .zshenv é executado em todos os casos.

O motivo pelo qual eu quero fazer isso é verificar se existe um agente ssh em execução e utilizá-lo no shell recém-aberto, se houver.

Eu imagino que qualquer teste realizado seria melhor colocado em .zshrc (pois isso garante um shell interativo) e o script designado "evento de não-login" chamado de lá.

Eu provavelmente primeiro quero verificar se o novo shell já está sendo executado como parte de uma sessão SSH remota existente antes de testar o agente ssh, mas eu encontrei esta receita SE para este propósito.

Eu escolho Zsh como é o shell que eu prefiro, mas imagino que qualquer técnica correta para fazer isso seja aplicada de forma semelhante a outras shells.

    
por Geeb 24.01.2014 / 10:45

1 resposta

8
if [[ -o login ]]; then
  echo "I'm a login shell"
fi

if [[ -o interactive ]]; then
  echo "I'm interactive"
fi

[[ -o the-option ]] retornará verdadeiro se a opção estiver definida.

Você também pode obter os valores das opções com a matriz associativa especial $options ou executando set -o .

Para verificar se há um agente ssh:

if [[ -w $SSH_AUTH_SOCK ]]; then
  echo "there's one"
fi

Em ksh (e zsh ):

case $- in (*i*) echo interactive; esac
case $- in (*l*) echo login; esac

Em bash , é uma bagunça, você precisa:

case $- in *i*) echo interactive; esac # that should work in any Bourne/POSIX shell
case :$BASHOPTS: in (*:login_shell:*) echo login; esac

E $SHELLOPTS contém mais algumas opções. Algumas opções que você pode definir com set -<x> , algumas com set -o option , algumas com shopt -s option .

    
por 24.01.2014 / 11:16