zsh-确定哪个程序正在获取.zshrc?

zsh-确定哪个程序正在获取.zshrc?

我有一个非常大的~/.zshrc文件,它zsh是我在 Mac 上的默认 shell。从 GUI 启动 VS Code 时,VS Code 使用该.zshrc文件来获取环境变量。由于 VS Code 只需要环境变量,而不需要别名和函数,是否可以评估哪个程序正在获取文件.zshrc,以便.zshrc在 VS Code 获取文件时跳过别名和函数定义?

对 @jimtut 的回答的反馈:[[ -o login ]]或者[[ -o interactive]]在这种情况下不起作用。我猜 VS Code 确实启动了一个交互式登录 shell 来获取环境变量。

我在我的.zshrc中添加了这个:

if [[ -o login ]] && [[ -o interactive ]]; then
    /usr/local/bin/terminal-notifier -message 'login: true\ninteractive: true'
fi

terminal-notifier并且我看到了从 GUI 启动 VS Code 时的通知。

有关 VS Code 和环境变量的更多信息:https://code.visualstudio.com/docs/supporting/faq#_resolving-shell-environment-is-slow-error-warning

答案1

我要进一步研究的一种方法是向我的包含一个“日志命令” .zshrc,如下所示:

{ date
  print -n process:; cat /proc/$$/cmdline
  print
  print -n parent:; cat /proc/$PPID/cmdline
  print
  print ++++++++++++++
} >>| ~/zshrc-log

通过这个小小的窥探,您会得到一个日志文件,其中包含日期、当前进程的命令行($$保存当前进程的 pid)和父进程(即调用)的命令行($PPID是父进程的 pid)。

也许这已经足以弄清楚发生了什么。然后,您可以使用测试来检查/proc/$PPID/cmdline在 VS Code 调用时是否应在某个时间点中止文件的来源(此后只有函数/别名才会出现)。

假设您有/proc可用的文件系统。如果没有,但ps手头有命令,您可以尝试

{ date; ps -o pid,args $$ $PPID } >>| ~/zshrc-log

它也更短,所以可能普遍更可取。

答案2

我使用tcsh,而不是任何 Bourne shell 衍生产品(真的,原始版本sh对于您的交互式 shell 来说很糟糕,所以我已经在这个csh系列中呆了很长时间)。

在 中tcsh,您可以执行以下操作:

if ( $?prompt ) then
  # setup your complicated things that only YOU need interactively
endif

我不得不用 Google 来了解如何做到这一点zsh,当然,在另一个 Stack 网站上找到了答案:https://unix.stackexchange.com/questions/110737/how-would-i-detect-a-non-login-shell-in-zsh

if [[ -o interactive ]]; then
  echo "I'm interactive"
fi

相关内容