调用zsh,使其运行命令,然后进入交互模式而不是退出


32

我想启动类似于

zsh -c 'my_prog option1 option2'

但是不要让我在运行该命令后退出,而要把我留在被调用的zsh的属性上(无论从何处调用它)。一个特定的用例是在screenrc文件中,您可以执行以下操作:

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

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

Answers:


24

并非我建议这样做。

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

您还可以使用屏幕和使用$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

如果在屏幕上,并且如果存在~/.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 2010年

我希望避免嵌套的壳,但是哦。
Autoplectic 2010年

14

我在这里找到了不需要额外外壳的解决方案。加:

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

到.zshrc,然后使用

zsh -is eval 'your shell command here'

真的非常适合一次启动很多shell。


6

追加; exec zsh到命令呢?这样一来,最后只剩下一个壳。


5
实际上,如果您不需要exec ; zsh -i,那么它已经为您完成了。
达伦·霍尔

4

eval "$RUN"尽头了.zshrc。现在,我可以运行命令而无需额外的shell了:

RUN='my_prog opt1 opt2' zsh

这似乎很奇怪-但是效果很好!
zaTricky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.