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.

Autoplectique
la source

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.

Darren Hall
la source
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.

gravitation
la source
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.

TRS-80
la source
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
Zaz
la source
Cela semble un peu étrange - mais cela fonctionne si bien!
zaTricky