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


32

я хотів би почати zsh подібний до

zsh -c 'my_prog option1 option2'

але замість виходу після виконання цієї команди, залишаючи мене під назвою викликаного zsh (не там, звідки він викликається). Один конкретний випадок використання для цього - у файлах screenrc, ви можете зробити щось на кшталт:

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

і після запуску цієї команди вам залишається оболонка, а не вона закривається.

Відповіді:


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.


кудо для того, щоб навчати мене про SHLVL
Nicolas Dumazet

Я сподівався уникнути вкладеної оболонки, але добре.
Autoplectic

14

Я знайшов рішення , яке працює без додаткової оболонки тут . Додати:

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

до .zshrc, а потім дзвоніть zsh за допомогою

zsh -is eval 'your shell command here'

Дійсно чудово для запуску багато снарядів одночасно.


6

А як щодо додавання ; exec zshдо команди? Таким чином, в кінці залишилася лише одна оболонка.


5
Ви фактично не потребуєте exec, якщо вам ; zsh -i, це вже для вас.
Зал Даррен

4

Я маю eval "$RUN"в кінці свого .zshrc. Тепер я можу запускати команди без додаткової оболонки, використовуючи:

RUN='my_prog opt1 opt2' zsh

Це здається дивним хитом - але воно працює так добре!
zaTricky
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.