вызовите zsh, выполнив команду, а затем войдите в интерактивный режим вместо выхода

32

я хотел бы начать Zsh похож на

zsh -c 'my_prog option1 option2'

но вместо того, чтобы выйти после выполнения этой команды, я остаюсь на стороне вызываемого zsh (не там, где он вызывается). один конкретный вариант использования этого в файлах screenrc, вы можете сделать что-то вроде:

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

и после выполнения этой команды у вас остается оболочка, а не закрывающаяся.

Autoplectic
источник

Ответы:

25

Не то, чтобы я советовал делать это.

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

Есть другие трюки, которые вы можете играть с экраном и с помощью $STYпеременной.

Если вы хотите, чтобы что-то запускалось из zsh на отдельных экранах, вы можете проверить переменную $ STY в вашем .zshrc или .zlogin. Это в формате <PID>.<TTY>.<HOSTNAME>.

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

Если на экране есть, и если ~/.zsh-<TTY>(из переменной $ STY) существует источник, то продолжайте свой веселый путь. Вы также можете установить переменную окружения перед вызовом интерактивной оболочки.

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

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

Добавьте эти проверки в ваш .zshrc / .zlogin.

Даррен Холл
источник
слава за то, что научил меня о SHLVL
Николас Думазет
я надеялся избежать вложенной оболочки, ну да ладно.
Автоплектика
14

Я нашел решение, которое работает без дополнительной оболочки здесь . Добавлять:

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

в .zshrc, затем вызовите zsh с помощью

zsh -is eval 'your shell command here'

Действительно отлично подходит для запуска большого количества снарядов одновременно.

тяготение
источник
6

Как насчет добавления ; exec zshв команду? Таким образом, в конце осталась только одна оболочка.

TRS-80
источник
5
Вам на самом деле не нужен исполнительный директор, если вы ; zsh -i, он уже делает это для вас.
Даррен Холл
4

У меня есть eval "$RUN"в конце моего .zshrc. Теперь я могу запускать команды без дополнительной оболочки:

RUN='my_prog opt1 opt2' zsh
Zaz
источник
Это кажется странным препятствием - но это работает так хорошо!
zaTricky