28

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

zsh -c 'my_prog option1 option2'

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

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

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

4 ответа4

24

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

(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.

10

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

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

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

zsh -is eval 'your shell command here'

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

5

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

4

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

RUN='my_prog opt1 opt2' zsh

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .