Jak sprawdzić, której powłoki używam?

356

Czytałem, że terminal jest niczym innym jak powłoką, a Unix zapewnia różne smaki powłok:

  • Skorupa Bourne'a (sh)
  • Powłoka C (csh)
  • Powłoka TC (TCsh)
  • Korn shell (ksh)
  • Powłoka Bourne Again (bash)

Pytania:

  • Kiedy otwieram okno terminala, która powłoka jest otwierana domyślnie?
  • Jak sprawdzić, ile powłok jest zainstalowanych?
  • Jak zmienić powłokę używaną z mojego konta?
LearNer969
źródło
@KasiyA Ma to również związek z askubuntu.com/questions/87853/…
stokrotka
Zauważ, że terminal jest interfejsem do powłoki (która w pewnym momencie była faktycznie interfejsem fizycznym), a powłoka nie jest terminalem - to interpreter poleceń. Zobacz także askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

Odpowiedzi:

425

Możesz wpisać następujące polecenie w swoim terminalu, aby zobaczyć, której powłoki używasz:

echo $0

Wynik będzie wyglądał podobnie do poniższego, jeśli używasz terminalu bash ( Bourne Again Shell ):

-bash
kingmilo
źródło
2
jest 0zmienną środowiskową?
Mi_Onim
43
@Mi_Onim $ 0 to nazwa uruchomionego procesu. Jeśli użyjesz go w powłoce, zwróci ona nazwę powłoki. Jeśli użyjesz go w skrypcie, będzie to nazwa skryptu.
kingmilo
2
UWAGA : to nie zadziała dla interaktywnych csh. % echo $0 No file for $0., ale to działatcsh
Sergiy Kolodyazhnyy
2
Nie działa, jeśli ktoś jest dowiązaniem symbolicznym. Tak bashjaksh
Anwar,
9
@Anwar ma rację, po otrzymaniu nazwy powłoki echo $0, ls -l `which <name>` aby sprawdzić, czy jest ona dowiązana do innego pliku binarnego powłoki.
JivanAmara,
121

Aby znaleźć powłokę w domyślnym środowisku, możesz sprawdzić wartość SHELLzmiennej środowiskowej:

echo $SHELL

Aby znaleźć bieżącą instancję powłoki, poszukaj procesu (powłoki) o numerze PID bieżącej instancji powłoki.

Aby znaleźć PID bieżącej instancji powłoki:

echo "$$"

Teraz, aby znaleźć proces mający PID:

ps -p <PID>

Składając to razem:

ps -p "$$"
heemayl
źródło
27
$ SHELL jest domyślną powłoką dla systemu (lub użytkownika), która zwykle jest (ale niekoniecznie) powłoką, która jest faktycznie używana w danym momencie.
kingmilo
1
@kingmilo: Masz rację, odpowiedź zmodyfikowana.
heemayl
Uznałem, że jest to bardzo przydatne, gdy przechodzę do użytkownika przez 'su - <nazwa użytkownika>', np. Do konfigurowania postgres, jenkins, ...
bully
1
echo $SHELLdał mi /bin/cshi ps -p $$dał mi 22673 pts/1 00:00:00 bash. Kingmilo wyjaśnił (powyżej), dlaczego nie są takie same.
18446744073709551615
@ 18446744073709551615 Nie powiedziałem też, że są takie same. Przeczytaj uważnie odpowiedź ponownie; zwróć uwagę na domyślne i bieżące sformułowania.
heemayl
25

$SHELLdaje domyślną powłokę. $0daje bieżącą powłokę.

Na przykład: mam domyślną powłokę bash, której używam w mojej aplikacji terminalowej. Ale dla mojej aplikacji iTerm2 używam komendy jak otworzy się okno: /bin/ksh.

Więc mój $0daje mi /bin/kshiTerm2. $SHELLdaje mi /bin/bashiTerm2. $0, $SHELLdaje mi /bin/bashw terminalu

thenakulchawla
źródło
2
To niezła dwuznaczność innych najczęściej głosowanych odpowiedzi. Dziękuję Ci.
Michael Hoffmann
Dla mnie mam zainstalowany zsh i jest to bieżąca wartość domyślna, aby zmienić na bash, wszystko co muszę zrobić, wpisz bashterminal. Aby wrócić do zsh, wpiszzsh
Yousuf Azad
8

Aby wiedzieć, która jest domyślną powłoką dla twojego użytkownika, możesz uruchomić:

echo "$SHELL"

Na przykład, jeśli używasz Bash, powinieneś otrzymać następujące dane wyjściowe:

/bin/bash

Jeśli nie zmieniłeś żadnej konfiguracji, powinien to być Bash, ponieważ Bash jest domyślną powłoką na Ubuntu.

kos
źródło
/ bin / sh jest językiem poleceń powłoki, a nie powłoką Bourne'a, edytuj swoją odpowiedź.
kingmilo
@kingmilo W /bin/shmojej odpowiedzi nie ma odniesienia
kos
@kol był przed edycją. Należy również pamiętać, że $ SHELL jest domyślną powłoką dla systemu (lub użytkownika), która zwykle jest (ale niekoniecznie) powłoką, która jest faktycznie używana w danym momencie.
kingmilo
1
@kingmilo Czytając odpowiedź jeszcze raz myślę, że rozumiem, o co ci chodzi, prawdopodobnie nie wyraziłem się dobrze. Wyjaśniłem znaczenie słowa „obecnie” w mojej odpowiedzi
kos
1
@Frederickjh fish jest trochę dziwny. $$Zmienna jest faktycznie zdefiniowany przez POSIX i będzie działać na większości muszli. Fish zdecydował się nie stosować tutaj standardu, więc myślę, że sprawiedliwie go zignorować. Mogę potwierdzić, że $$działa zgodnie z oczekiwaniami w sh, dash, bash, zsh, ksh, ash, tcsh i csh. W rzeczywistości z czubka mojej głowy nie mogę wymyślić żadnej innej skorupy, z wyjątkiem ryb, które nie działają.
terdon
8

Inne odpowiedzi zwykle używają funkcji specyficznych dla powłoki, ale staramy się odkryć, której powłoki używamy, więc przyjmują odpowiedź na problem. Na przykład żadna z odpowiedzi nie zadziała na rybach.

sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p

Zamiast tego użyj składni $$ w wywołaniu sh, ale wtedy szukamy PPID, a nie PID. Użyj PPID, aby znaleźć cmd.

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

Dzięki za ulepszenie @muru

Evan Benn
źródło
2
Możesz użyć ppid=/, cmd=aby pominąć nagłówki (i tak też tail -1s) i zastanowić /proc/.../exesię, czy plik nie jest uruchamiany (ponieważ cmdwyjściem można manipulować przez cokolwiek, co uruchomiło powłokę).
mur
1
Najwyraźniej to nie działa w busybox, z powodu braku zgodności z posix: ref: github.com/broadinstitute/cromwell/pull/…
Evan Benn
4

Oryginalny post zadał trzy pytania. Podane odpowiedzi obejmują pierwsze pytanie: „Kiedy otwieram okno terminala, która powłoka jest domyślnie otwierana?” Odpowiadają również na pytanie, które NIE zostało zadane, a mianowicie: „Jak mogę dowiedzieć się, która powłoka działa obecnie w terminalu?”. Jednak, o ile wiem, nikt nie odpowiedział na pierwotnie zadane pytanie drugie lub trzecie, a mianowicie: „Jak sprawdzić, ile zainstalowanych powłok?” i „Jak zmienić powłokę używaną z mojego konta?”

  • Aby odpowiedzieć „Jak sprawdzić, ile powłok jest zainstalowanych?” następujące polecenie wyświetli listę wszystkich dostępnych powłok:

cat / etc / shells

Na przykład w przypadku domyślnej instalacji Ubuntu 18.10 daje to:

# / etc / shells: poprawne powłoki logowania

/ bin / sh

/ bin / dash

/ bin / bash

/ bin / rbash

Jednak domyślnie sh jest dowiązaniem symbolicznym do dash, podczas gdy rbash prowadzi do bash z opcją -r („bash ograniczony”), więc w rzeczywistości są tylko dwie powłoki, a nie cztery, jak sugeruje powyższa lista. Następujące polecenie pokaże, czy którakolwiek z wymienionych powłok jest w rzeczywistości dowiązaniami symbolicznymi, a jeśli tak, to gdzie prowadzą do: ls -l / bin

Michael D.
źródło