获取在 zsh 中运行的命令的值(-c 参数的值)

获取在 zsh 中运行的命令的值(-c 参数的值)

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

相关内容