TLDR:如何在执行命令之前访问传入的命令的值zsh -c "command"
。假设此代码将在以下任一位置运行~/.zshenv
(或者~/.zshrc
如果zsh
作为登录 shell 调用)。
我在一台无法运行的机器上运行chsh
,并且值仍然存在。为了解决这个问题,我在~/.zshrc
.
local nix_zsh_exe="path to my own installation of zsh"
if [[ -z "$ZSH_AUTO_RAN_NIX_ZSH" && -x ''${nix_zsh_exe} ]]; then
export ZSH_AUTO_RAN_NIX_ZSH=true
export SHELL=''${nix_zsh_exe}
exec $SHELL --login
fi
这破坏了 IntelliJ/Pycharm 等在 Mac 上获取环境变量的能力。IntelliJ 在子进程中执行以下命令,并解析输出以获取环境变量普通的(即交互式登录)shell 就会有。
$SHELL -l -i -c '${PATH_TO_INTELLIJ_APP_DIR}/bin/printenv
我知道我可以通过查看setopt -o
或通过$options
数组来判断它是登录 shell 还是交互式 shell。因此我需要一种方法来访问传递给它的命令,这样我就可以使用原始参数重新执行另一个 zsh 安装。
答案1
您可以使用$ZSH_EXECUTION_STRING
参数来获取使用设置的值zsh -c
。
ZSH_EXECUTION_STRING
:如果 shell 是使用选项 -c 启动的,则它包含传递给该选项的参数。否则不设置。
它在终端上的样子如下:
$ echo $ZSH_EXECUTION_STRING
$ echo $ZSH_SCRIPT
$ ./scr.zsh
$ZSH_SCRIPT: ./scr.zsh
$ZSH_EXECUTION_STRING:
$ zsh -itc 'echo "$ZSH_EXECUTION_STRING" && ./scr.zsh'
echo "$ZSH_EXECUTION_STRING" && ./scr.zsh
$ZSH_SCRIPT: ./scr.zsh
$ZSH_EXECUTION_STRING:
这对于自动启动其他交互式终端程序(如 tmux)也很有用。以下是一个例子tmux
当放置在 zshrc 中时,启动时启动的代码片段:
if [[ -z ${TMUX+X}${ZSH_SCRIPT+X}${ZSH_EXECUTION_STRING+X} ]]; then
exec tmux
fi