Я хочу, чтобы мой bash-скрипт (в частности, мой ~/.bashrc
) делал что-то, только если терминал был открыт мной непосредственно, и делал что-то еще, если он был открыт через приложение, например VS Code. Как я могу определить, в чем дело? Есть переменная для этого? Заранее спасибо.
bash
gnome-terminal
bashrc
Бумажный пакет
источник
источник
env
команду. Посмотрите, есть ли переменная, специфичная для VS, которую мы можем использовать.yakuake
и имеюPULSE_PROP_OVERRIDE_application.name=Yakuake
набор переменных , иxterm
устанавливаетXTERM_VERSION=XTerm(322)
на моей машине.env >env_term1
в одном эмуляторе,env >env_term2
во втором и как использовать то, чтоdiff env_term{1,2}
говорит, очень полезен. В конце концов, OP говорит, например, VS Code .Ответы:
Возможно, вы могли бы сделать это, пройдя назад по наследству оболочки и выяснив, была ли она запущена чем-то, что приравнивается к «вам», или другой программой.
Получите PID оболочки (идентификатор процесса) и, следовательно, его PPID (идентификатор родительского процесса). Продолжайте идти вверх, пока не доберетесь до чего-то, что скажет вам, откуда это произошло. Возможно, вам придется экспериментировать на вашей системе - по крайней мере, я не знаю, будет ли она универсальной.
Например, в моей системе получите PID оболочки и используйте,
ps
чтобы показать, что этоbash
:Получить PPID 18852:
Узнайте, что такое PPID (18842):
Мы видим, что это gnome-терминал, то есть эмулятор терминала / окно терминала. Может быть, этого достаточно, если ваша оболочка, запущенная другой программой, не работает в окне эмулятора терминала.
Если это не достаточно хорошо, поднимитесь на другой уровень:
Это говорит нам о том, что
gnome-terminal
было начатоinit
. Я подозреваю, что ваша оболочка, запущенная другой программой, будет иметь что-то другое.источник
pstree -s $$
init
процесс не pid 1, хотя, не уверен, что это что-то изменит.gnome-terminal
. Я выполнил свою команду под,if [ $(pstree -s $$ | grep "gnome-terminal" -c) -gt 0 ]; then ...
и это сработало.Что касается кода Visual Studio, очевидно, есть способ установить дополнительные переменные среды для интегрированного терминала . Итак, настройте Visual Studio для использования этой конфигурации:
И внутри
~/.bashrc
:В общем, вы можете положиться на среду, данную
bash
процессу. Например, в$TERM
переменной , и запустить аналогичнуюif..then...else...fi
ветвь для[ "$TERM" = "xterm" ]
или что - то еще. В каждом конкретном случае вы можете исследовать различия в среде, запустивenv
каждую консоль, сохранив ее в файле, какenv > output_console1.txt
иdiff output_console1.txt output_console2.txt
в соответствии с рекомендациями десертной в комментариях .источник
$Env:var
это не синтаксис для переменных среды в Bash. Для меня это похоже на Powershell.$foo
что достаточно. Кофе, наверное, недостаточно.Если вы говорите об одном конкретном стороннем приложении, используйте переменную окружения. Большинство программ передают всю среду без изменений, когда они форк + исполняют новые процессы.
Итак, запустите это приложение с пользовательским env var, который вы можете проверить . например, создайте для него псевдоним
alias vs=RUNNING_FROM_VSCODE=1 VSCode
или создайте скрипт-обёртку следующим образом:Тогда по вашему
.bashrc
, вы можете сделатьАрифметическое утверждение bash
(( ))
является истинным, если выражение оценивается как ненулевое целое число (именно поэтому я использовал1
выше). Пустая строка (для не заданного env var) имеет значение false. Это хорошо для булевых переменных bash, но вы можете также легко использоватьtrue
и проверить это с помощью традиционной POSIXЕсли ваше приложение в основном очищает среду для своих дочерних элементов , но все еще не
$PATH
изменяется, вы можете использовать это в своей оболочке:и проверьте его с помощью сопоставления с шаблоном, например bash,
[[ "${PATH%RUNNING_FROM_VSCODE}" != "$PATH" ]]
чтобы проверить, не изменяет ли суффикс из PATH.Это должно безвредно сделать один дополнительный поиск в каталоге, когда программа ищет не найденные внешние команды.
/dev/null
безусловно, не является каталогом в любой системе, поэтому его можно использовать как фиктивный каталог, который быстро приведет к тому,ENOTDIR
что поиски PATH не найдут то, что ищут в более ранних записях PATH.источник
Вот мои 2 цента. Просто добавь это к себе
.bashrc
. Заменитеterminals
свои любимые терминалы и командуйте своимиexport
.источник