wywołaj zsh, uruchamiając polecenie, a następnie wejdź w tryb interaktywny zamiast wychodzić

32

chciałbym zacząć zsh podobny do

zsh -c 'my_prog option1 option2'

ale zamiast wychodzić po uruchomieniu tej komendy, zostawiam mnie przy poleceniu wywołanego zsh (nie skądkolwiek jest wywoływana). jeden szczególny przypadek użycia tego jest w plikach screenrc, możesz zrobić coś takiego:

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

a po uruchomieniu tego polecenia masz tam powłokę zamiast jej zamykania.

Autoplektyka
źródło

Odpowiedzi:

24

Nie to, że radziłbym to zrobić.

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

Istnieją inne sztuczki, w które można grać przy użyciu ekranu i $STYzmiennej.

Jeśli chcesz, aby coś uruchamiało się z zsh na poszczególnych ekranach, możesz sprawdzić zmienną $ STY w .zshrc lub .zlogin. Jest w formacie <PID>.<TTY>.<HOSTNAME>.

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

Jeśli znajduje się na ekranie, a jeśli istnieje ~/.zsh-<TTY>(ze zmiennej $ STY), znajdź to, a następnie kontynuuj na swój wesoły sposób. Możesz także ustawić zmienną środowiskową przed wywołaniem powłoki interaktywnej.

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

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

Dodaj te czeki do swojego .zshrc / .zlogin.

Darren Hall
źródło
podziękowania za nauczenie mnie o SHLVL
Nicolas Dumazet
Miałem nadzieję uniknąć zagnieżdżonej skorupy, ale no cóż.
Autoplectic
14

Znalazłem rozwiązanie, które działa bez dodatkowej powłoce tutaj . Dodaj:

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

do .zshrc, a następnie wywołaj zsh za pomocą

zsh -is eval 'your shell command here'

Naprawdę świetne do uruchamiania wielu pocisków jednocześnie.

grawitacja
źródło
6

A co z dołączeniem ; exec zshdo polecenia? W ten sposób na końcu pozostała tylko jedna skorupa.

TRS-80
źródło
5
Tak naprawdę nie potrzebujesz exec, jeśli już ; zsh -ito robi.
Darren Hall,
4

Mam eval "$RUN"na końcu moje .zshrc. Teraz mogę uruchamiać polecenia bez dodatkowej powłoki:

RUN='my_prog opt1 opt2' zsh
Zaz
źródło
Wydaje się to dziwne, ale działa tak dobrze!
zaTricky