Je veux que mon script bash (spécifiquement le mien ~/.bashrc
) ne fasse quelque chose que si le terminal a été ouvert par moi directement, et fasse autre chose s'il a été ouvert via une application, par exemple VS Code. Comment puis-je déterminer quel est le cas? Y a-t-il une variable pour cela? Merci d'avance.
bash
gnome-terminal
bashrc
Sac en papier
la source
la source
env
commande. Voyez s'il y a une variable spécifique à VS que nous pouvons utiliser.yakuake
et j'ai unPULSE_PROP_OVERRIDE_application.name=Yakuake
ensemble de variables et desxterm
ensemblesXTERM_VERSION=XTerm(322)
sur ma machine.env >env_term1
dans un émulateur,env >env_term2
dans un second et comment utiliser ce quidiff env_term{1,2}
est dit est très utile. Après tout, OP dit par exemple VS Code .Réponses:
Vous pourriez probablement le faire en remontant l'ascendance du shell et en déterminant s'il a été démarré par quelque chose qui équivaut à «vous» ou un autre programme.
Obtenez le PID du shell (ID de processus), et de là son PPID (ID de processus parent). Continuez à monter jusqu'à ce que vous arriviez à quelque chose qui vous indique d'où il vient. Vous devrez peut-être expérimenter sur votre système - au moins, je ne sais pas si ce sera universel.
Par exemple, sur mon système, obtenez le PID d'un shell et utilisez
ps
pour montrer que c'estbash
:Obtenez le PPID de 18852:
Découvrez ce qu'est le PPID (18842):
Nous pouvons voir que c'est gnome-terminal, c'est-à-dire l'émulateur de terminal / fenêtre de terminal. C'est peut-être suffisant pour vous, si votre shell lancé par l'autre programme ne fonctionne pas dans une fenêtre d'émulateur de terminal.
Si ce n'est pas assez bon, montez d'un autre niveau:
Cela nous dit que cela
gnome-terminal
a commencé parinit
. Je soupçonne que votre shell lancé par un autre programme aura quelque chose de différent là-bas.la source
pstree -s $$
init
processus n'est cependant pas pid 1, je ne sais pas si cela changerait quelque chose.gnome-terminal
. J'ai exécuté ma commande sousif [ $(pstree -s $$ | grep "gnome-terminal" -c) -gt 0 ]; then ...
et cela a fonctionné.En ce qui concerne Visual Studio Code, il existe apparemment un moyen de définir des variables d'environnement supplémentaires pour le terminal intégré . Donc, configurez Visual Studio pour utiliser cette configuration:
Et dans
~/.bashrc
:En général, vous pouvez vous fier à l'environnement donné au
bash
processus. Par exemple, la$TERM
variable , et exécutez uneif..then...else...fi
branche similaire pour[ "$TERM" = "xterm" ]
ou autre chose. Au cas par cas, vous pouvez étudier les différences dans l'environnement via l'exécutionenv
dans chaque console, l'enregistrer dans un fichier comme dansenv > output_console1.txt
etdiff output_console1.txt output_console2.txt
comme suggéré par dessert dans les commentaires .la source
$Env:var
n'est pas la syntaxe des variables d'environnement dans Bash. Cela ressemble à une chose Powershell pour moi.$foo
assez. Le café ne suffit probablement pas.Si vous parlez d'une application tierce spécifique, utilisez une variable d'environnement. La plupart des programmes transmettront l’environnement entier inchangé lorsqu’ils forkent + exécutent de nouveaux processus.
Alors, démarrez cette application avec une var env personnalisée que vous pouvez vérifier . par exemple, créez un alias pour celui-ci
alias vs=RUNNING_FROM_VSCODE=1 VSCode
, ou créez un script wrapper comme ceci:Ensuite, dans votre
.bashrc
, vous pouvez faireUne instruction arithmétique bash
(( ))
est vraie si l'expression est évaluée à un entier non nul (c'est pourquoi j'ai utilisé1
ci-dessus). La chaîne vide (pour une variable env non définie) est fausse. C'est bien pour les variables booléennes bash, mais vous pouvez tout aussi bien l'utilisertrue
et le vérifier avec un POSIX traditionnelSi votre application efface principalement l'environnement pour ses enfants , mais passe toujours
$PATH
inchangée, vous pouvez utiliser ceci dans votre wrapper:et vérifiez-le avec un pattern-match comme bash
[[ "${PATH%RUNNING_FROM_VSCODE}" != "$PATH" ]]
pour vérifier si la suppression d'un suffixe de PATH le modifie.Cela devrait sans danger faire une recherche de répertoire supplémentaire lorsque le programme recherche des commandes externes introuvables.
/dev/null
n'est certainement pas un répertoire sur aucun système, il est donc sûr de l'utiliser comme un faux répertoire qui se traduira rapidementENOTDIR
si les recherches PATH ne trouvent pas ce qu'elles recherchent dans les entrées PATH antérieures.la source
Voici mes 2 cents. Ajoutez-le simplement à votre
.bashrc
. Remplacezterminals
par vos terminaux préférés etexport
commandez avec les vôtres.la source