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.

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.


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.


6

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


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

Esto parece un error extraño, ¡pero funciona muy bien!
zaTricky
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.