invoque zsh haciendo que ejecute un comando y luego ingrese al modo interactivo en lugar de salir

32

me gustaría comenzar zsh similar a

zsh -c 'my_prog option1 option2'

pero en lugar de salir después de ejecutar ese comando, dejándome en el propt del zsh invocado (no de donde sea que se llame). un caso de uso particular para esto es en los archivos screenrc, podría hacer algo como:

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

y después de ejecutar ese comando, te quedas con un shell allí en lugar de cerrarlo.

Autoplectic
fuente

Respuestas:

25

No es que yo aconsejaría hacer esto.

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

Hay otros trucos que puedes jugar con la pantalla y usar la $STYvariable.

Si desea que algo se ejecute desde zsh con pantallas individuales, puede verificar la variable $ STY dentro de su .zshrc o .zlogin. Está en el formato <PID>.<TTY>.<HOSTNAME>.

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

Si está en la pantalla, y si ~/.zsh-<TTY>(de la variable $ STY) existe, obtenga eso y luego continúe felizmente. También puede establecer una variable de entorno antes de llamar al shell interactivo.

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

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

Agregue esos cheques en su .zshrc / .zlogin.

Darren Hall
fuente
felicitaciones por enseñarme sobre SHLVL
Nicolas Dumazet
esperaba evitar el caparazón anidado, pero bueno.
Autoplectic
14

Encontré una solución que funciona sin un shell adicional aquí . Añadir:

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

a .zshrc, luego llame a zsh con

zsh -is eval 'your shell command here'

Realmente genial para poner en marcha muchos proyectiles a la vez.

gravitación
fuente
6

¿Qué hay de agregar ; exec zshal comando? De esa manera solo queda un caparazón al final.

TRS-80
fuente
55
De hecho, no necesita el ejecutivo si lo hace ; zsh -i, ya lo hace por usted.
Darren Hall
4

Tengo eval "$RUN"al final de mi .zshrc. Ahora puedo ejecutar comandos sin el shell adicional, con:

RUN='my_prog opt1 opt2' zsh
Zaz
fuente
Esto parece un error extraño, ¡pero funciona muy bien!
zaTricky