Zgodnie z moją wiedzą, aby określić bieżącą powłokę, której używamy echo $0
w powłoce. Zamiast tego chcę, aby mój skrypt sprawdzał, w której powłoce jest uruchomiony. Więc próbowałem wydrukować $0
w skrypcie i zwraca nazwę skryptu tak, jak powinien. Moje pytanie brzmi: w jaki sposób mogę znaleźć powłokę, w której działa mój skrypt podczas działania?
22
echo $0
nie jest tu opcją, ponieważ skrypt będzie działał na wielu różnych maszynach, gdzie pierwszą rzeczą, którą muszę sprawdzić, jest powłoka.#! /bin/sh -
u góry, będzie działaćsh
. Masz na myśli, jaki to wariantsh
?Odpowiedzi:
W systemie Linux możesz użyć
/proc/PID/exe
.Przykład:
źródło
/bin/sed -r -e 's/\x0.*//' /proc/$$/cmdline
zamiast tego daje zsh lub ksh. (Byłoby to 0 USD, gdyby powłoki nie naprawiły tego magicznie, aby zamiast tego nadać nazwę skryptom)./proc
jest tak brzydka i nieprzenośna, jak to tylko możliwe./proc
nie jest „brzydki”./proc
jest często bardzo eleganckim rozwiązaniem. Nieportowalne tak, ale ponieważ coś jest niesportowalne, nie czyni tego brzydkim./proc
brzydki, ponieważ pliki w nim mogą przychodzić i odchodzić według kaprysu programistów, a zawartość plików może się zmieniać bez uprzedzenia, powodując niekończący się ból z powodu bitrotu i przenoszenia formatów plików docelowych.Może nie to, o co prosisz, ale powinno to w pewnym stopniu działać, aby zidentyfikować interpretera, który interpretuje go obecnie dla kilku takich jak Thompson (osh), Bourne, Bourne-again (bash), Korn (ksh88, ksh93, pdksh, mksh ), zsh, zgodny z zasadami zwykły (posh), Yet Another (yash), rc, akanga, es shells, wish, tclsh, expect, perl, python, ruby, php, JavaScript (przynajmniej nodejs, powłoka SpiderMonkey i JSPL) , MS / Wine cmd.exe, command.com (MSDOS, FreeDOS ...).
Pierwszą wersję skryptu what_interpreter zamieściłem około 2004 r. Na usenet. Sven Mascheck ma (prawdopodobnie bardziej przydatny) skrypt o nazwie whatshell, który koncentruje się na identyfikowaniu powłok podobnych do Bourne'a. Można również znaleźć wersję scaloną naszych dwóch skryptów tam .
źródło
print
się na funkcję.bash 3.2.53(1)-release
jako interpretujący go tłumacz.Właśnie tego używam w moim .profile do sprawdzania różnych powłok w systemach, na których pracuję. Nie robi wyraźnych różnic między ksh88 i ksh93, ale nigdy mnie nie zawiodło.
Pamiętaj, że nie wymaga pojedynczego widelca ani rury.
źródło
ksh93
mają$KSH_VERSION
. Ta zmienna pochodzipdksh
i nigdy nie dotarła do AT&T ksh88.FCEDIT
.posh
(pdksh z usuniętą większością funkcji innych niż POSIX, więc prawdopodobnie będziesz chciał nazwać to „sh”) nie ma FCEDIT ani KSH_VERSION, ale ma PS3 (może nie na długo), chociaż jest mało prawdopodobne, aby ktoś miał go jako powłokę logowania . Zauważ też, że powyższy kod nie odzwierciedlałby tego,bash
czyzsh
jest wsh
trybie emulacji, co może być problemem, jeśli$PROFILE_SHELL
decydujesz, czy włączyć tę czy inną funkcję. Zobacz także whatshell Sven Mascheck, aby dowiedzieć się więcej, co możesz (lub nie) chcieć sprawdzić.Możesz spróbować
która da ci nazwę polecenia powiązanego z pid skryptu.
źródło
cmd
nacomm
kiedy POSIXifying odpowiedź.Jeśli w systemie jest
lsof
dostępna komenda, możesz uzyskać pełną ścieżkę do wykonywalnej powłoki nadrzędnej, pobierając nadrzędny identyfikator PIDps
i analizując wyniklsof -p $ppid
(zobacz Jak określić bieżącą powłokę, nad którą pracuję? ).źródło
/
, jeśli użyję ,NR==4
otrzymam ścieżkę do rodzica powłoki.sh
mają$PPID
zmienną. WłączLinux
, możesz użyćreadlink -f "/proc/$PPID/exe"
.Poza linuksem Linux lub brakiem dostępu do systemu plików / proc lub równorzędnym, możesz skorzystać z pstree:
Zakładając, że masz pid
Na komputerze Mac:
W systemie Linux:
Format i styl wyjścia z pstree różni się w zależności od środowiska, ale możesz wymusić wyjście ASCII, a następnie sed / tr / awk / etc. odfiltruj dane wyjściowe, aby uzyskać powłokę uruchamiającą skrypt.
Tak więc wyczyszczona wersja wyjściowa (działa w systemie Mac lub Linux OS):
Wydajność przy uruchomieniu:
A kiedy działa z inną powłoką:
Wydajność:
Nie wymaga rootowania ani specjalnego systemu plików. Zauważ, że moje filtrowanie zakłada, że nazwa binarna powłoki kończy się na sh i że nie ma żadnych pośrednich wpisów kończących się na sh. Zakłada również, że nie nazwałeś swojego skryptu „sh” lub jakiegoś niefortunnego wzoru grep, który zatarłby informacje. :) Będzie wymagać dostosowania w twoim środowisku, aby zapewnić wyższy stopień niezawodności.
źródło
Możesz użyć polecenia:
aby znaleźć powłokę z poziomu skryptu.
źródło
$SHELL
Jest powłoką wyboru użytkownika. Zainicjowany z powłoki logowania użytkownika. Nie ma to nic wspólnego z aktualnie działającą powłoką.