chame o zsh, executando um comando e, em seguida, entre no modo interativo em vez de sair

32

eu gostaria de começar o zsh semelhante ao

zsh -c 'my_prog option1 option2'

mas em vez de sair depois de executar esse comando, me deixando à margem do zsh invocado (não de onde quer que seja chamado). um caso de uso específico para isso está nos arquivos screenrc, você pode fazer algo como:

screen -t my_prog 0 zsh -c 'my_prog opt1 opt2'

e depois de executar esse comando, você fica com um shell em vez de fechar.

Autoplectic
fonte

Respostas:

24

Não que eu recomendaria isso.

(sirius)~: zsh -c 'print hello; zsh -i'
hello
(sirius)~: echo $SHLVL
2

Existem outros truques que você pode jogar com a tela e usando a $STYvariável

Se você deseja que algo seja executado a partir do zsh com telas individuais, é possível verificar a variável $ STY no seu .zshrc ou .zlogin. É no formato <PID>.<TTY>.<HOSTNAME>.

if [[ -n $STY ]] then
  if [[ -f ~/.zsh-$STY[(ws:.:)2] ]] then
    . ~/.zsh-$STY[(ws:.:)2]
  fi
fi

Se estiver na tela e se ~/.zsh-<TTY>(da variável $ STY) existir, forneça essa fonte e continue no seu caminho alegre. Você também pode definir uma variável de ambiente antes de chamar o shell interativo.

> FOO=bar zsh -i
> env | grep FOO
FOO=bar

> RUNTHISCOMMAND=/path/to/script zsh -i
.zshrc:
if [[ -n $RUNTHISCOMMAND ]] then
   $RUNTHISCOMMAND
fi

Adicione essas verificações ao seu .zshrc / .zlogin.

Darren Hall
fonte
elogios para me ensinar sobre SHLVL
Nicolas Dumazet
eu esperava evitar a concha aninhada, mas tudo bem.
Autoplectic
14

Encontrei uma solução que funciona sem um shell extra aqui . Adicionar:

if [[ $1 == eval ]]
then
    "$@"
set --
fi

para .zshrc e chame zsh com

zsh -is eval 'your shell command here'

Realmente ótimo para iniciar várias conchas ao mesmo tempo.

gravitação
fonte
6

Que tal acrescentar ; exec zshao comando? Dessa forma, resta apenas uma concha no final.

TRS-80
fonte
5
Na verdade, você não precisa do executivo se precisar ; zsh -i, já faz isso por você.
Darren Hall
4

Eu tenho eval "$RUN"no final do meu .zshrc. Agora posso executar comandos sem o shell extra, com:

RUN='my_prog opt1 opt2' zsh
Zaz
fonte
Isso parece um argumento estranho - mas funciona tão bem!
zaTricky 28/02