57 votes

invoquer zsh, lui faire exécuter une commande, puis entrer en mode interactif au lieu de sortir

J'aimerais démarrer zsh de la même manière que

zsh -c 'my_prog option1 option2'

mais au lieu de sortir après l'exécution de cette commande, il me laisse à la position de la commande zsh invoquée (et non pas à l'endroit d'où elle est appelée) :

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.

36voto

vaske Points 2468

Ce n'est pas que je conseille de le faire.

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

Il existe d'autres astuces avec l'écran et l'utilisation de la fonction $STY variable.

Si vous voulez que zsh exécute quelque chose avec des écrans individuels, vous pouvez vérifier la variable $STY dans votre .zshrc ou .zlogin. Elle se présente sous la forme suivante <PID>.<TTY>.<HOSTNAME> .

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

Si dans l'écran, et si ~/.zsh-<TTY> (de la variable $STY) existe, sourcez-la, puis continuez votre 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 vérifications dans votre fichier .zshrc/.zlogin.

17voto

sfink Points 898

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

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

au fichier .zshrc, puis appeler zsh avec

zsh -is eval 'your shell command here'

Très utile pour démarrer de nombreuses coquilles en même temps.

11voto

Benedict Cohen Points 6997

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

8voto

rlanham Points 61

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

RUN='my_prog opt1 opt2' zsh

0voto

Rolf Points 101

Je l'ai dans mon .zshrc :

alias uce='USE_CUSTOM_ENV=1 zsh'
if [[ "${USE_CUSTOM_ENV}" == "1" ]]; then
        alias a='stuff I need in this context'
        alias x='exit'
        ...

        PROMPT="${PROMPT}%{$terminfo[bold]$fg[red]%}[CUSTOM_ENV] %{$reset_color%}"
        my_prog option1 option2
fi

Lors de l'invocation de uce sur la ligne de commande, un nouveau sous-shell interactif est invoqué, dans lequel my_prog est exécuté. Cette approche a l'avantage de me donner un environnement personnalisé (avec des alias, des fonctions, des envvars, etc.) pour le contexte spécifique.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X