Quiero que mi script bash (específicamente mi ~/.bashrc
) haga algo solo si abrí el terminal directamente, y que haga algo más si se abrió a través de una aplicación, por ejemplo, VS Code. ¿Cómo puedo determinar cuál es el caso? ¿Hay una variable para eso? Gracias por adelantado.
bash
gnome-terminal
bashrc
Bolsa de papel
fuente
fuente
env
comando. Vea si hay una variable específica de VS que podamos usar.yakuake
y tengo unPULSE_PROP_OVERRIDE_application.name=Yakuake
conjunto variable , yxterm
conjuntosXTERM_VERSION=XTerm(322)
en mi máquina.env >env_term1
en un emulador,env >env_term2
en un segundo y cómo usar lo quediff env_term{1,2}
dice es muy útil. Después de todo, OP dice, por ejemplo, VS Code .Respuestas:
Probablemente podría hacerlo caminando de regreso a la ascendencia del shell y averiguando si fue iniciado por algo que equivale a "usted" u otro programa.
Obtenga el PID del shell (ID del proceso), y de ahí su PPID (ID del proceso padre). Sigue subiendo hasta llegar a algo que te diga de dónde vino. Es posible que deba experimentar en su sistema; al menos, no sé si será universal.
Por ejemplo, en mi sistema, obtenga el PID de un shell y úselo
ps
para mostrar que esbash
:Obtenga el PPID de 18852:
Descubra cuál es el PPID (18842):
Podemos ver que es gnome-terminal, es decir, el emulador de terminal / ventana de terminal. Tal vez eso sea lo suficientemente bueno para usted, si su shell lanzado por el otro programa no se ejecuta en una ventana de emulador de terminal.
Si no es lo suficientemente bueno, sube otro nivel:
Esto nos dice que
gnome-terminal
fue iniciado porinit
. Sospecho que su shell iniciado por otro programa tendrá algo diferente allí.fuente
pstree -s $$
init
embargo, ese proceso no es pid 1, no estoy seguro de si eso cambiaría algo.gnome-terminal
. Ejecuté mi comando bajoif [ $(pstree -s $$ | grep "gnome-terminal" -c) -gt 0 ]; then ...
y funcionó.En lo que respecta a Visual Studio Code, aparentemente hay una manera de establecer variables de entorno adicionales para el terminal integrado . Entonces, configure Visual Studio para usar esta configuración:
Y dentro de
~/.bashrc
:En general, puede confiar en el entorno dado al
bash
proceso. Por ejemplo, la$TERM
variable , y ejecuta unaif..then...else...fi
rama similar para[ "$TERM" = "xterm" ]
o algo más. En cada caso, puede investigar las diferencias en el entorno mediante la ejecuciónenv
en cada consola, guardarlo en el archivo como enenv > output_console1.txt
, ydiff output_console1.txt output_console2.txt
como sugiere el postre en los comentarios .fuente
$Env:var
no es la sintaxis para las variables de entorno en Bash. Esto me parece una cosa de Powershell.$foo
es suficiente. El café probablemente no es suficiente.Si está hablando de una aplicación de terceros específica, use una variable de entorno. La mayoría de los programas pasarán todo el entorno sin cambios cuando bifurcan + ejecutan nuevos procesos.
Entonces, inicie esta aplicación con un entorno personalizado que puede verificar . Por ejemplo, crea un alias para él
alias vs=RUNNING_FROM_VSCODE=1 VSCode
o crea un script de envoltura como este:Entonces en tu
.bashrc
, puedes hacerUna declaración aritmética bash
(( ))
es verdadera si la expresión se evalúa como un número entero distinto de cero (que es la razón por la que usé1
anteriormente). La cadena vacía (para una variable de entorno no establecida) es falsa. Es bueno para las variables booleanas bash, pero podría usarlotrue
y verificarlo fácilmente con un POSIX tradicionalSi su aplicación limpia principalmente el entorno para sus hijos , pero sigue
$PATH
sin cambios, puede usar esto en su contenedor:y verifíquelo con un patrón de coincidencia como bash
[[ "${PATH%RUNNING_FROM_VSCODE}" != "$PATH" ]]
para verificar si quitar un sufijo de PATH lo cambia.Esto debería hacer inofensivamente una búsqueda de directorio adicional cuando el programa busca comandos externos no encontrados.
/dev/null
definitivamente no es un directorio en ningún sistema, por lo que es seguro usarlo como un directorio falso que resultará rápidamenteENOTDIR
si las búsquedas PATH no encuentran lo que están buscando en las entradas PATH anteriores.fuente
Aquí están mis 2 centavos. Solo agrégalo a tu
.bashrc
. Reemplaceterminals
con sus terminales favoritas yexport
ordene con las suyas.fuente