调用 zsh,让它运行一个命令,然后进入交互模式而不是退出

Aut*_*tic 46 zsh

我想启动 zsh 类似于

zsh -c 'my_prog option1 option2'
Run Code Online (Sandbox Code Playgroud)

但不是在运行该命令后退出,而是将我留在调用的 zsh 的属性上(而不是从它被调用的任何地方)。一个特殊的用例是在 screenrc 文件中,您可以执行以下操作:

screen -t my_prog 0 zsh -c 'my_prog opt1 opt2'
Run Code Online (Sandbox Code Playgroud)

运行该命令后,您将在那里留下一个外壳,而不是关闭。

Dar*_*all 32

并不是说我会建议这样做。

(sirius)~: zsh -c 'print hello; zsh -i'
hello
(sirius)~: echo $SHLVL
2
Run Code Online (Sandbox Code Playgroud)

您还可以使用 screen 和使用$STY变量玩其他技巧。

如果你想在单独的屏幕上从 zsh 运行某些东西,你可以检查 .zshrc 或 .zlogin 中的 $STY 变量。它是在格式中<PID>.<TTY>.<HOSTNAME>

if [[ -n $STY ]] then
  if [[ -f ~/.zsh-$STY[(ws:.:)2] ]] then
    . ~/.zsh-$STY[(ws:.:)2]
  fi
fi
Run Code Online (Sandbox Code Playgroud)

如果在屏幕中,并且如果~/.zsh-<TTY>(来自 $STY 变量)存在,则获取该源,然后继续您的快乐方式。您还可以在调用交互式 shell 之前设置环境变量。

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

> RUNTHISCOMMAND=/path/to/script zsh -i
.zshrc:
if [[ -n $RUNTHISCOMMAND ]] then
   $RUNTHISCOMMAND
fi
Run Code Online (Sandbox Code Playgroud)

将这些检查添加到您的 .zshrc/.zlogin 中。

  • 感谢您教我有关 SLVL 的知识 (2认同)

gra*_*ion 15

我在这里找到了一个无需额外外壳即可工作的解决方案。添加:

if [[ $1 == eval ]]
then
    "$@"
set --
fi
Run Code Online (Sandbox Code Playgroud)

到 .zshrc,然后调用 zsh

zsh -is eval 'your shell command here'
Run Code Online (Sandbox Code Playgroud)

非常适合一次启动大量 shell。


Zaz*_*Zaz 8

eval "$RUN"在我的.zshrc. 我现在可以在没有额外 shell 的情况下运行命令:

RUN='my_prog opt1 opt2' zsh
Run Code Online (Sandbox Code Playgroud)


TRS*_*-80 7

附加; exec zsh到命令怎么样?这样最后就只剩下一个壳了。

  • 你实际上不需要 exec 如果你`; zsh -i`,它已经为你做到了。 (6认同)