我有一个非常大的~/.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