我希望我的bash脚本(特别是我的
~/.bashrc
)只在终端由我直接打开时执行某些操作,而在通过应用程序如VS Code打开时执行其他操作。
我该如何确定情况是什么?是否有相应的变量可以判断?
提前感谢您的帮助。~/.bashrc
)只在终端由我直接打开时执行某些操作,而在通过应用程序如VS Code打开时执行其他操作。
我该如何确定情况是什么?是否有相应的变量可以判断?
提前感谢您的帮助。你可能可以通过追溯 shell 的祖先并确定它是由与"你"相等的东西或其他程序启动的方式来实现。
获取 shell 的 PID(进程 ID),然后从中获取其 PPID(父进程 ID)。继续向上直到找到告诉你它从哪里来的东西。你可能需要在你的系统上尝试一下,至少我不知道它是否普适。
例如,在我的系统上,获取一个 shell 的 PID 并使用 ps
显示它是 bash
:
$ echo $$
18852
$ ps --pid 18852
PID TTY TIME CMD
18852 pts/1 00:00:00 bash
$ ps -o ppid= -p 18852
18842
$ ps --pid 18842
PID TTY TIME CMD
18842 ? 00:00:02 gnome-terminal
$ ps -o ppid= -p 18842
2313
$ ps --pid 2313
PID TTY TIME CMD
2313 ? 00:00:00 init
gnome-terminal
是由 init
启动的。我怀疑你的 shell 是由另一个程序启动的,那里可能会有一些不同的东西。pstree -s $$
的结果来查看。 - steeldriverinit
进程并不是pid 1,不确定这会不会改变什么。 - kasperdgnome-terminal
的子进程运行。我在if [ $(pstree -s $$ | grep "gnome-terminal" -c) -gt 0 ]; then ...
下执行了我的命令,结果成功了。 - PaperBag"terminal.integrated.env.linux": {
"visual_studio": "true"
}
~/.bashrc
文件中:if [ -n "$visual_studio" ]; then
# do something for Visual Studio
else
# do something else for other types of terminal
fi
$TERM
variable,并且运行类似的if..then...else...fi
分支,用于判断[ "$TERM" = "xterm" ]
或其他情况。根据具体情况,你可以通过在每个控制台中运行env
来调查环境的差异,将其保存到文件中,如env > output_console1.txt
,然后使用diff output_console1.txt output_console2.txt
进行比较,正如评论中的dessert所建议的那样。$Env:var
不是 Bash 中的环境变量语法。这看起来更像是 Powershell 的东西。 - Dietrich Epp$foo
就足够了。咖啡可能不够。 - Sergiy Kolodyazhnyy#!/bin/sh
export RUNNING_FROM_VSCODE=1
exec VSCode "$@"
.bashrc
文件中,你可以这样做。if (($RUNNING_FROM_VSCODE)); then
echo "started from inside VSCode"
# RUNNING_FROM_VSCODE=0 # optional if you only want the immediate child
fi
(( ))
在表达式求值为非零整数时为真(这就是我之前使用1
的原因)。空字符串(对于未设置的环境变量)为假。它适用于bash布尔变量,但你也可以使用true
并通过传统的POSIX方式进行检查。if [ "x$RUNNING_FROM_VSCODE" = "xtrue" ]; then
echo "started from inside VSCode"
fi
$PATH
不变,您可以在包装器中使用以下代码:#!/bin/sh
export PATH="$PATH:/dev/null/RUNNING_FROM_VSCODE"
exec VSCode "$@"
并且使用类似于bash的模式匹配来检查它,例如[[ "${PATH%RUNNING_FROM_VSCODE}" != "$PATH" ]]
,以检查从PATH中去除后缀是否会改变它。
当程序在寻找未找到的外部命令时,这应该只会无害地进行一次额外的目录查找。在任何系统上,/dev/null
绝对不是一个目录,因此可以安全地将其用作一个虚假的目录,如果PATH搜索在较早的PATH条目中找不到所需内容,它将迅速导致ENOTDIR
错误。
run_in_terminal(){
local parent_command="$(ps --no-headers --pid $PPID -o command | awk '{print $1;}')"
local parent="$(basename $parent_command)"
local terminals=( gnome-terminal st xterm ) # list your favorite terminal here
if [[ ${terminals[*]} =~ ${parent} ]]; then
# Your commands to run if in terminal
export MY_VAR_IN_TERMINAL="test"
fi
}
run_in_terminal
env
命令,看看是否有我们可以使用的特定于 VS 的变量。 - Sergiy Kolodyazhnyyyakuake
并设置了一个变量PULSE_PROP_OVERRIDE_application.name=Yakuake
,而且xterm
在我的电脑上设置了XTERM_VERSION=XTerm(322)
。 - dessertenv >env_term1
这样的答案在一个模拟器中,env >env_term2
在第二个模拟器中,并且如何使用diff env_term{1,2}
的结果非常有用。毕竟,OP说的是例如 VS Code。 - dessert