Rufen Sie zsh auf, und lassen Sie es einen Befehl ausführen. Wechseln Sie dann in den interaktiven Modus, anstatt zu beenden

32

ich möchte zsh ähnlich wie zsh starten

zsh -c 'my_prog option1 option2'

Aber anstatt zu beenden, nachdem Sie diesen Befehl ausgeführt haben, lassen Sie mich am Ende des aufgerufenen Befehls zsh (nicht von wo immer er aufgerufen wird). Ein besonderer Anwendungsfall hierfür sind screenrc-Dateien. Sie können beispielsweise Folgendes tun:

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

und nachdem Sie diesen Befehl ausgeführt haben, haben Sie dort eine Shell, anstatt sie zu schließen.

Autoplektisch
quelle

Antworten:

24

Nicht, dass ich dazu raten würde.

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

Es gibt andere Tricks, die Sie mit dem Bildschirm und der $STYVariablen spielen können.

Wenn Sie möchten, dass etwas von zsh mit einzelnen Bildschirmen ausgeführt wird, können Sie die Variable $ STY in Ihrer .zshrc- oder .zlogin-Datei überprüfen. Es ist im Format <PID>.<TTY>.<HOSTNAME>.

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

Wenn auf dem Bildschirm vorhanden und ~/.zsh-<TTY>(aus der Variablen $ STY) vorhanden ist, geben Sie diese Quelle an, und fahren Sie auf Ihrem fröhlichen Weg fort. Sie können auch eine Umgebungsvariable festlegen, bevor Sie die interaktive Shell aufrufen.

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

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

Fügen Sie diese Checks in Ihr .zshrc / .zlogin ein.

Darren Hall
quelle
Ein dickes
Lob, dass
Ich hatte gehofft, die verschachtelte Shell zu vermeiden, aber na ja.
Autoplektischer
14

Ich habe hier eine Lösung gefunden, die ohne zusätzliche Shell auskommt . Hinzufügen:

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

zu .zshrc und dann mit zsh aufrufen

zsh -is eval 'your shell command here'

Wirklich großartig, um viele Muscheln gleichzeitig zu starten.

Gravitation
quelle
6

Was ist mit dem Anhängen ; exec zshan den Befehl? Auf diese Weise bleibt am Ende nur eine Shell übrig.

TRS-80
quelle
5
Sie brauchen den exec eigentlich nicht, wenn Sie ; zsh -idas schon für Sie tun .
Darren Hall
4

Ich habe eval "$RUN"am Ende meines .zshrc. Ich kann jetzt Befehle ohne die zusätzliche Shell ausführen, mit:

RUN='my_prog opt1 opt2' zsh
Zaz
quelle
Das klingt komisch - aber es funktioniert so gut!
ZaTricky