我想启动类似于
zsh -c 'my_prog option1 option2'
但是运行该命令后并没有退出,而是停留在被调用的 zsh 的 propt 处(而不是调用它的地方)。一个特定的用例是在 screenrc 文件中,你可以执行以下操作:
screen -t my_prog 0 zsh -c 'my_prog opt1 opt2'
运行该命令之后,你会留在那里一个 shell,而不是关闭它。
答案1
我并不建议这么做。
(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 变量)存在,则获取该变量,然后继续。您还可以在调用交互式 shell 之前设置环境变量。
> FOO=bar zsh -i
> env | grep FOO
FOO=bar
> RUNTHISCOMMAND=/path/to/script zsh -i
.zshrc:
if [[ -n $RUNTHISCOMMAND ]] then
$RUNTHISCOMMAND
fi
将这些检查添加到您的 .zshrc/.zlogin 中。
答案2
我找到了一个不需要额外 shell 的解决方案这里。 添加:
if [[ $1 == eval ]]
then
"$@"
set --
fi
到 .zshrc,然后使用以下命令调用 zsh
zsh -is eval 'your shell command here'
非常适合同时启动大量 shell。
答案3
那么附加; exec zsh
到命令中怎么样?这样最后就只剩下一个 shell 了。
答案4
我的里面有这个.zshrc
:
alias uce='USE_CUSTOM_ENV=1 zsh'
if [[ "${USE_CUSTOM_ENV}" == "1" ]]; then
alias a='stuff I need in this context'
alias x='exit'
...
PROMPT="${PROMPT}%{$terminfo[bold]$fg[red]%}[CUSTOM_ENV] %{$reset_color%}"
my_prog option1 option2
fi
uce
在命令行上调用时,将调用一个新的交互式子 shell,并my_prog
执行。这种方法的优点是为我提供了针对特定上下文的自定义环境(具有别名、函数、环境变量等)。