Chcę, aby mój skrypt bash (konkretnie mój ~/.bashrc
) zrobił coś tylko wtedy, gdy terminal został otwarty przeze mnie bezpośrednio, i zrobiłbym coś innego, jeśli został otwarty za pośrednictwem aplikacji, np. VS Code. Jak mogę ustalić, co się dzieje? Czy jest na to zmienna? Z góry dziękuję.
bash
gnome-terminal
bashrc
Papierowa torba
źródło
źródło
env
polecenie. Sprawdź, czy istnieje zmienna specyficzna dla VS, której możemy użyć.yakuake
i mamPULSE_PROP_OVERRIDE_application.name=Yakuake
zestaw zmiennych ixterm
zestawówXTERM_VERSION=XTerm(322)
na moim komputerze.env >env_term1
w jednym emulatorze,env >env_term2
w drugim i jak używać tegodiff env_term{1,2}
, co mówi, jest bardzo przydatna. W końcu OP mówi np . Kod VS.Odpowiedzi:
Prawdopodobnie możesz to zrobić, wracając do przodków powłoki i sprawdzając, czy została ona uruchomiona przez coś, co jest równoznaczne z „tobą”, czy innym programem.
Uzyskaj PID powłoki (identyfikator procesu), a następnie jego PPID (identyfikator procesu nadrzędnego). Idź dalej, aż dojdziesz do czegoś, co powie ci, skąd to się wzięło. Być może będziesz musiał poeksperymentować na swoim systemie - przynajmniej nie wiem, czy będzie uniwersalny.
Na przykład w moim systemie pobierz PID powłoki i użyj,
ps
aby pokazać, żebash
:Uzyskaj PPID z 18852:
Dowiedz się, czym jest PPID (18842):
Widzimy, że jest to terminal gnome, tj. Emulator terminala / okno terminala. Może to ci wystarczy, jeśli twoja powłoka uruchomiona przez inny program nie działa w oknie emulatora terminala.
Jeśli to nie wystarczy, przejdź na wyższy poziom:
To mówi nam, że
gnome-terminal
zacząłinit
. Podejrzewam, że twoja powłoka uruchomiona przez inny program będzie miała tam coś innego.źródło
pstree -s $$
init
proces nie jest jednak pid 1, nie jestem pewien, czy to cokolwiek zmieni.gnome-terminal
. Wykonałem swoje polecenie pod dowództwemif [ $(pstree -s $$ | grep "gnome-terminal" -c) -gt 0 ]; then ...
i zadziałało.Jeśli chodzi o Visual Studio Code, najwyraźniej istnieje sposób na ustawienie dodatkowych zmiennych środowiskowych dla zintegrowanego terminala . Więc skonfiguruj Visual Studio, aby używał tej konfiguracji:
I w ciągu
~/.bashrc
:Ogólnie można polegać na środowisku danego
bash
procesu. Na przykład, w$TERM
zmiennej i uruchomić podobnyif..then...else...fi
oddział dla[ "$TERM" = "xterm" ]
lub coś innego. W zależności od przypadku możesz zbadać różnice w środowisku, uruchamiając jeenv
w każdej konsoli, zapisz to w pliku jak w plikuenv > output_console1.txt
idiff output_console1.txt output_console2.txt
zgodnie z sugestią deseru w komentarzach .źródło
$Env:var
nie jest składnią zmiennych środowiskowych w Bash. Dla mnie to wygląda jak PowerShell.$foo
wystarczy. Kawa prawdopodobnie nie wystarczy.Jeśli mówisz o konkretnej aplikacji innej firmy, użyj zmiennej środowiskowej. Większość programów przejdzie bez zmian po całym środowisku, gdy rozwidlają + wykonują nowe procesy.
Więc uruchom tę aplikację z niestandardową zmienną env, którą możesz sprawdzić . np. utwórz dla niego alias
alias vs=RUNNING_FROM_VSCODE=1 VSCode
lub utwórz skrypt otoki w następujący sposób:Wtedy
.bashrc
możesz zrobićInstrukcja arytmetyczna bash
(( ))
jest prawdziwa, jeśli wyrażenie ma wartość niezerową liczbę całkowitą (dlatego użyłem1
powyżej). Pusty ciąg znaków (dla nie ustawionej zmiennej env var) ma wartość false. Przydaje się to w przypadku zmiennych logicznych bash, ale równie łatwo można użyćtrue
i sprawdzić za pomocą tradycyjnego POSIXJeśli twoja aplikacja w większości usuwa środowisko dla swoich dzieci , ale nadal przechodzi
$PATH
bez zmian, możesz użyć tego w swoim opakowaniu:i sprawdź go za pomocą dopasowania do wzorca, takiego jak bash,
[[ "${PATH%RUNNING_FROM_VSCODE}" != "$PATH" ]]
aby sprawdzić, czy usunięcie sufiksu z PATH to zmieni.Powinno to nieszkodliwie wykonać jedno dodatkowe wyszukiwanie katalogu, gdy program szuka nie znalezionych poleceń zewnętrznych.
/dev/null
zdecydowanie nie jest katalogiem w żadnym systemie, więc można bezpiecznie używać go jako fałszywego katalogu, który szybko spowoduje,ENOTDIR
że wyszukiwania PATH nie znajdą tego, czego szukają we wcześniejszych wpisach PATH.źródło
Oto moje 2 centy. Po prostu dodaj go do swojego
.bashrc
. Zamień naterminals
swoje ulubione terminale i steruj swoimiexport
.źródło