Czy skrypt bash jest taki sam jak skrypt powłoki?

58

Jestem bardzo nowy w Ubuntu. Słyszę, jak ludzie mówią „skrypty powłoki”, „skrypty bash”.

Zastanawiam się, czy są tacy sami? Czy oni są inni?

ordynans
źródło
Przydaje się użyteczna odpowiedź w SO
Mr. Pei

Odpowiedzi:

55

Bash ( bash) jest jedną z wielu dostępnych (ale najczęściej używanych) powłok uniksowych. Bash to skrót od „ B ourne A gain SH ell” i jest zamiennikiem / ulepszeniem oryginalnej powłoki Bourne'a ( sh).

Skrypty powłoki to skrypty w dowolnej powłoce, podczas gdy skrypty Bash to skrypty specjalnie dla Bash. W praktyce jednak „skrypt powłoki” i „skrypt basha” są często używane zamiennie, chyba że dana powłoka nie jest Bash.

EDYCJA: W rzeczywistości domyślną powłoką skryptową w Ubuntu jest dash, natomiast domyślną powłoką interaktywną (otrzymywaną po podłączeniu terminalu) jest Bash. Niemniej jednak te dwa terminy są nadal w większości zamienne.

Hilton Shumway
źródło
1
Co definiuje myślnik jako domyślną powłokę skryptową?
wjandrea,
1
@wjandrea Fakt, że /bin/shjest dowiązaniem symbolicznym, /bin/dashtworzy domyślną powłokę systemową , ale nie jest to domyślna powłoka skryptowa , tzn. nie ma pisemnej reguły, której absolutnie musisz użyć /bin/sh. Kiedy się /bin/shgo używa, jest to przede wszystkim ze względu na przenośność, gdy oczekuje się, że skrypt będzie używany na wielu platformach systemu operacyjnego typu Unix, z których większość ma /bin/shpowłokę rodziny Bourne zgodną z POSIX.
Sergiy Kolodyazhnyy
29

Wprowadzenie

Skrypty powłoki i Bashskrypty nie są tym samym, ponieważ istnieją inne powłoki, takie jak shte, których można użyć do wykonania skryptu; skrypt przeznaczony do wykonania Bashpowinien być oznaczony jako Bashskrypt. Terminy są często używane zamiennie, ponieważ Bashdzięki swojej rozszerzonej funkcjonalności w porównaniu do tych shjest najczęściej używane do wykonywania skryptów użytkownika w wielu dystrybucjach. Jednak istnieją inne takie jak muszle Korn (ksh), C shell (csh)a Z shell (zsh), ale nie będziemy się do nich tutaj jako dyskusji shi bashjest najbardziej istotne dla Ubuntu. Świetny artykuł IBM o tym szczegółowo opisuje ewolucję powłok w Linuksie i dobrze opisuje architekturę powłok oraz różnice między nimi.

Skrypty powłoki

Shbyła oryginalną powłoką uniksową opracowaną przez Stephena Bourne'a; jednak systemy oparte na Debianie i Ubuntu traktują je dashjako swoją shpowłokę ( shjest faktycznie dowiązane symbolicznie dash). W Debianie i Ubuntu, ze względu na szybkość sh, jest częściej używany do krytycznych procedur systemowych i wykonywania skryptów kluczowych podczas uruchamiania; po więcej szczegółów zobacz wiki Ubuntu . Bashoznacza Bourne Again SHell i został opracowany później przez Briana Foxa i znacznie rozszerzył oryginał sh. Rozwój Foxa i innych Bashbył ważną częścią projektu GNU. Więcej informacji można znaleźć w tej wspaniałej dyskusji na temat historii Bash.

Ważne jest, aby pamiętać, że zarówno, jak shi Bashużywane w Ubuntu i innych dystrybucjach, są POSIXzgodne, co oznacza, że ​​subskrybują szereg standardów dotyczących wykonywania poleceń w Powłoce. Ma to na celu zapewnienie, że wyniki skryptów używanych w systemie operacyjnym można wiarygodnie przewidzieć, a zachowanie powłoki może być utrzymywane w ramach tych POSIXparametrów, ponieważ jest to szczególnie ważne dla programistów. Więcej informacji na temat standardów znajduje się w oficjalnej dokumentacji .

Często skrypty powłoki mają sufiks .sh, nawet jeśli są przeznaczone do wykonywania jako bashskrypty i znajdują się #!/bin/bashna górze skryptu. W rzeczywistości nie ma znaczenia, czy skrypt nazywa się script.sh czy my.script , liczy się to, czy wywołanie interpretera to /bin/shczy /bin/bash. Skrypty powłoki mogą być również nazywane w linii poleceń z albo shalbo bash.

Jednakże, jest to ważne , aby pamiętać, że wyniki mogą być różne w zależności od interpreter nazywany jest, jak nie wszystkie bashkomendy będą pracować sh, podczas gdy większość shpoleceń działa w bash. Ogólnie rzecz biorąc, większość użytkowników będzie chciała używać /bin/bashich skryptów, aby mogli skorzystać z rozszerzonego zestawu funkcji; skrypty systemowe można wykonać, /bin/shjeśli jest to wymagane.

Zasoby do tworzenia skryptów Bash Shell

Czasami trudno jest znaleźć przydatne zasoby online, które są zgodne z dobrą praktyką i dają porady, które pozwolą ci stworzyć przydatne skrypty. Po tym man bash, niektóre z najważniejszych zasobów to wiki Grega , hakerzy Bash i ostatnia książka Steve'a Parkera na temat skryptów Shell, która koncentruje się głównie na Bashpublikacjach O'Reilly. Dobre wprowadzenie podejmuje również Przewodnik dla początkujących Bash .


źródło
2
Ta odpowiedź jest w rzeczywistości lepsza od mojej (odpowiedź zaakceptowana), moja właśnie przyszła na tydzień przed tym.
Hilton Shumway,
4

Istnieje wiele muszle dostępne dla Ubuntu, jak bash, zsh, ksh, tcshi csh.

Więc za każdym razem, gdy ktoś mówi „ muszla” , mówi o jednym z nich. Jednak te muszle różnią się nieco od siebie. Tak więc, gdy ktoś mówi o bashskryptach, używa powłoki, ale kiedy ktoś mówi o skryptach powłoki, nie używa per se bash. Ale jak bashto jest zwykle używane w skryptach dla Ubuntu, zwykle tak jest. Co więcej, różne powłoki są takie same pod wieloma względami, więc zwykle nie ma to znaczenia.

fromnaboo
źródło
2
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr  3 08:58 /bin/bash*

To pokazuje, że „sh” jest dowiązaniem symbolicznym do „dash”, a / bin / bash, która jest domyślną powłoką interaktywną w Ubuntu, jest plikiem wykonywalnym, który jest prawie 9 razy większy niż / bin / sh.

Rzeczywiście, „man sh” (1590 linii) vs „man bash” (5459 linii) pokazuje, że bash jest dużym nadzbiorem tradycyjnego „sh”.

Przeczytaj więcej tutaj:

arielf
źródło
2

Skrypt powłoki zostałby zdefiniowany jako skrypt zorientowany na przenośność, który może być uruchamiany przez powłokę systemową systemów operacyjnych zgodnych z POSIX. Składnia byłaby identyczna lub podobna do składni języka skryptowego powłoki zdefiniowanej przez standard POSIX. Jest to standard dla większości systemów operacyjnych zgodnych z POSIX, takich jak Linux / Unix / * BSD itp. POSIX jest najczęstszą podstawą kompatybilności w różnych systemach operacyjnych.

Różne systemy operacyjne od wyżej wspomnianych implementują różne powłoki do nieinteraktywnego użytku (tj. Do wykonywania skryptów systemowych lub skryptów używających #! /bin/shshebang), które oprócz implementacji poleceń i składni POSIX mają własne rozszerzenia lub mogą zostać pozbawione mniej użytecznych funkcji ze względów wydajnościowych, ale podstawa POSIX pozwala na bardzo wysoki poziom przenośności skryptów zaprojektowanych dla różnych systemów operacyjnych zgodnych z POSIX.

Większość wyżej wymienionych systemów operacyjnych ma oddzielną interaktywną powłokę, która jest zwykle w pełni funkcjonalnym bash . Bash jest w dużej mierze zgodny z POSIX, ale ma też dużą pulę dodatkowych poleceń i obsługuje inną składnię. Uruchomienie Bash z opcją wiersza polecenia --posix lub wykonanie „set -o posix” podczas działania Bash spowoduje, że Bash będzie bardziej zgodny ze standardem POSIX, zmieniając zachowanie tak, aby było zgodne z tym określonym przez POSIX w obszarach, w których domyślna jest Bash różni się, patrz: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html

Specyfikator Shebang i jednolite ścieżki do plików wykonywalnych powłoki w systemach operacyjnych typu Unix

Dzięki jednolitym regułom umieszczania plików wykonywalnych dla powłok (zwykle znajdują się one w katalogu „/ bin /”), możemy mieć jednolite reguły tworzenia skryptów powłoki, a dokładniej, jesteśmy pewni, jaką ścieżkę umieścić w wyrażeniu shebang, aby wskazywać na odpowiedni plik wykonywalny powłoki do uruchomienia skryptu. Systemy plików Unix / Linux / * BSD nie obsługują rozszerzeń wewnętrznie, więc rozszerzenia plików służą jedynie jako dodatkowa wskazówka lub do celów indeksowania.

W szczególności na Debianie / Ubuntu bin/shznajduje się dowiązanie symboliczne wskazujące na bin/dashplik wykonywalny powłoki dash . To sprawia, że ​​dash jest powłoką systemową, która, jak się szacuje, jest 4x szybsza i ma rozmiar o 1/10 większy niż bardziej funkcjonalny bash. źródło: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash

Debian / Ubuntu interaktywny terminal jest domyślnie, jak w wielu innych uniksowych systemach operacyjnych, bash, dla których droga jest również jednolity: /bin/bash.

Standard POSIX.1-2017: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html

Ogólną zasadą byłoby:

Jeśli polecenie lub opcja nie jest zdefiniowana przez POSIX, to nie umieszczaj jej w #! /bin/shskrypcie.

Konwertuj skrypt lub sprawdź błędy

Aby przekonwertować skrypt z bash na POSIX, możesz chcieć automatycznie sprawdzić błędy w skrypcie powłoki lub zobaczyć, jakie zmiany w skrypcie bash powinieneś wprowadzić, aby był zgodny z POSIX:

https://www.shellcheck.net/

http://mywiki.wooledge.org/Bashism

Ola
źródło
1
Całkiem dobra odpowiedź, +1. Witamy w AskUbuntu!
Sergiy Kolodyazhnyy
1
Jeśli chodzi o Dash jako / bin / sh na Ubuntu, jest artykuł na ten temat, który również możesz zacytować. I jest też askubuntu.com/q/976485/295286
Sergiy Kolodyazhnyy