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.

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.


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.


6

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


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

Wydaje się to dziwne, ale działa tak dobrze!
zaTricky
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.