Ich möchte, dass mein Bash-Skript (speziell mein ~/.bashrc
) nur dann etwas tut, wenn das Terminal direkt von mir geöffnet wurde, und etwas anderes, wenn es über eine App geöffnet wurde, z. B. VS-Code. Wie kann ich feststellen, was der Fall ist? Gibt es dafür eine Variable? Danke im Voraus.
bash
gnome-terminal
bashrc
Papiertüte
quelle
quelle
env
Befehl aus. Überprüfen Sie, ob es eine VS-spezifische Variable gibt, die wir verwenden können.yakuake
und habe einen VariablensatzPULSE_PROP_OVERRIDE_application.name=Yakuake
undxterm
SätzeXTERM_VERSION=XTerm(322)
auf meinem Computer.env >env_term1
in einem Emulator,env >env_term2
in einem zweiten und wie man das verwendet, wasdiff env_term{1,2}
sagt, ist sehr nützlich. Immerhin sagt OP zB VS Code .Antworten:
Sie könnten es wahrscheinlich tun, indem Sie die Vorfahren der Shell zurückgehen und herausfinden, ob sie von etwas gestartet wurde, das "Ihnen" entspricht, oder von einem anderen Programm.
Rufen Sie die PID (Prozess-ID) der Shell und daraus die PPID (übergeordnete Prozess-ID) ab. Gehen Sie weiter, bis Sie zu etwas kommen, das Ihnen sagt, woher es kommt. Möglicherweise müssen Sie mit Ihrem System experimentieren - zumindest weiß ich nicht, ob es universell ist.
Holen Sie sich beispielsweise auf meinem System die PID einer Shell und
ps
zeigen Sie damit an, dass es sich um Folgendes handeltbash
:Holen Sie sich die PPID von 18852:
Finden Sie heraus, was die PPID (18842) ist:
Wir können sehen, dass es sich um ein Gnome-Terminal handelt, dh um das Terminal-Emulator- / Terminal-Fenster. Vielleicht ist das gut genug für Sie, wenn Ihre vom anderen Programm gestartete Shell nicht in einem Terminalemulatorfenster ausgeführt wird.
Wenn es nicht gut genug ist, gehe ein anderes Level hinauf:
Dies sagt uns, dass
gnome-terminal
von gestartet wurdeinit
. Ich vermute, dass Ihre Shell, die von einem anderen Programm gestartet wurde, dort etwas anderes haben wird.quelle
pstree -s $$
init
Prozess ist jedoch nicht pid 1, nicht sicher, ob dies etwas ändern würde.gnome-terminal
. Ich habe meinen Befehl unter ausgeführtif [ $(pstree -s $$ | grep "gnome-terminal" -c) -gt 0 ]; then ...
und es hat funktioniert.Was Visual Studio Code betrifft, gibt es anscheinend eine Möglichkeit, zusätzliche Umgebungsvariablen für das integrierte Terminal festzulegen . Richten Sie Visual Studio für die Verwendung dieser Konfiguration ein:
Und innerhalb
~/.bashrc
:Im Allgemeinen können Sie sich auf die Umgebung verlassen, die dem
bash
Prozess zugewiesen wurde. Zum Beispiel die$TERM
Variable , und führen Sie einen ähnlichenif..then...else...fi
Zweig für[ "$TERM" = "xterm" ]
oder etwas anderes aus. Von Fall zu Fall können Sie die Unterschiede in der Umgebung untersuchenenv
, indem Sie sie in jeder Konsole ausführen, diese in der Datei speichern, wie inenv > output_console1.txt
unddiff output_console1.txt output_console2.txt
wie vom Dessert in den Kommentaren vorgeschlagen .quelle
$Env:var
ist nicht die Syntax für Umgebungsvariablen in Bash. Das sieht für mich wie eine Powershell-Sache aus.$foo
genügt. Kaffee ist wahrscheinlich nicht genug.Wenn Sie über eine bestimmte Drittanbieter-App sprechen, verwenden Sie eine Umgebungsvariable. Die meisten Programme werden die gesamte Umgebung unverändert weitergeben, wenn sie neue Prozesse fork + ausführen.
So starten Sie diese App mit einem benutzerdefinierten env var Sie überprüfen können . zB einen Alias dafür erstellen
alias vs=RUNNING_FROM_VSCODE=1 VSCode
oder ein Wrapper-Skript wie folgt erstellen:Dann können Sie in Ihrem
.bashrc
tunEine bash-arithmetische Anweisung
(( ))
ist wahr, wenn der Ausdruck eine Ganzzahl ungleich Null ergibt (weshalb ich1
oben verwendet habe). Die leere Zeichenfolge (für eine nicht gesetzte env var) ist false. Es ist gut für Boolesche Bash-Variablen, aber Sie können es genauso einfachtrue
mit einem herkömmlichen POSIX verwenden und überprüfenWenn Ihre App die Umgebung für ihre untergeordneten Elemente größtenteils löscht , sie jedoch
$PATH
unverändert weitergibt, können Sie dies in Ihrem Wrapper verwenden:und überprüfen Sie dies mit einem Pattern-Match wie Bash
[[ "${PATH%RUNNING_FROM_VSCODE}" != "$PATH" ]]
, um zu überprüfen, ob das Entfernen eines Suffixes aus PATH es ändert.Dies sollte harmlos eine zusätzliche Verzeichnissuche durchführen, wenn das Programm nach nicht gefundenen externen Befehlen sucht.
/dev/null
ist definitiv kein Verzeichnis auf einem System, daher ist es sicher, es als falsches Verzeichnis zu verwenden, das schnell dazu führt,ENOTDIR
dass PATH-Suchen in früheren PATH-Einträgen nicht das finden, wonach sie suchen.quelle
Hier sind meine 2 Cent. Fügen Sie es einfach zu Ihrem hinzu
.bashrc
. Ersetzen Sieterminals
durch Ihre bevorzugten Terminals undexport
befehlen Sie durch Ihre.quelle