invoquez zsh, en lui faisant exécuter une commande, puis passez en mode interactif au lieu de quitter


32

je voudrais commencer zsh similaire à

zsh -c 'my_prog option1 option2'

mais au lieu de quitter après avoir exécuté cette commande, me laissant à la disposition du zsh invoqué (pas d'où il est appelé). un cas d'utilisation particulier pour cela est dans les fichiers screenrc, vous pouvez faire quelque chose comme:

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

et après avoir exécuté cette commande, vous vous retrouvez avec un shell au lieu de le fermer.

Réponses:


25

Non pas que je vous conseille de le faire.

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

Il existe d'autres astuces que vous pouvez jouer avec l'écran et utiliser la $STYvariable.

Si vous voulez que quelque chose soit exécuté à partir de zsh avec des écrans individuels, vous pouvez vérifier la variable $ STY dans votre .zshrc ou .zlogin. C'est dans le format <PID>.<TTY>.<HOSTNAME>.

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

Si à l'écran, et si ~/.zsh-<TTY>(à partir de la variable $ STY) existe, source cela, puis continuez votre joyeux chemin. Vous pouvez également définir une variable d'environnement avant d'appeler le shell interactif.

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

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

Ajoutez ces chèques dans votre .zshrc / .zlogin.


bravo pour m'avoir renseigné sur SHLVL
Nicolas Dumazet

j'espérais éviter la coquille imbriquée, mais bon.
Autoplectic

14

J'ai trouvé une solution qui fonctionne sans shell supplémentaire ici . Ajouter:

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

à .zshrc, puis appelez zsh avec

zsh -is eval 'your shell command here'

Vraiment génial pour démarrer beaucoup de coques à la fois.


6

Qu'en est-il de l'ajout ; exec zshà la commande? De cette façon, il ne reste qu'un seul shell à la fin.


5
En fait, vous n'avez pas besoin de l'exec si vous le ; zsh -ifaites déjà.
Darren Hall

4

J'ai eval "$RUN"à la fin de mon .zshrc. Je peux maintenant exécuter des commandes sans le shell supplémentaire, avec:

RUN='my_prog opt1 opt2' zsh

Cela semble un peu étrange - mais cela fonctionne si bien!
zaTricky
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.