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

envcomando. Vea si hay una variable específica de VS que podamos usar.yakuakey tengo unPULSE_PROP_OVERRIDE_application.name=Yakuakeconjunto variable , yxtermconjuntosXTERM_VERSION=XTerm(322)en mi máquina.env >env_term1en un emulador,env >env_term2en 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
pspara 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-terminalfue iniciado porinit. Sospecho que su shell iniciado por otro programa tendrá algo diferente allí.fuente
pstree -s $$initembargo, 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
bashproceso. Por ejemplo, la$TERMvariable , y ejecuta unaif..then...else...firama similar para[ "$TERM" = "xterm" ]o algo más. En cada caso, puede investigar las diferencias en el entorno mediante la ejecuciónenven cada consola, guardarlo en el archivo como enenv > output_console1.txt, ydiff output_console1.txt output_console2.txtcomo sugiere el postre en los comentarios .fuente
$Env:varno es la sintaxis para las variables de entorno en Bash. Esto me parece una cosa de Powershell.$fooes 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 VSCodeo 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é1anteriormente). La cadena vacía (para una variable de entorno no establecida) es falsa. Es bueno para las variables booleanas bash, pero podría usarlotruey verificarlo fácilmente con un POSIX tradicionalSi su aplicación limpia principalmente el entorno para sus hijos , pero sigue
$PATHsin 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/nulldefinitivamente no es un directorio en ningún sistema, por lo que es seguro usarlo como un directorio falso que resultará rápidamenteENOTDIRsi 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. Reemplaceterminalscon sus terminales favoritas yexportordene con las suyas.fuente