Czy bash i sh wykonują skrypt inaczej? Wykonałem skrypt powłoki z użyciem bash i sh i otrzymałem te same dane wyjściowe. Więc jaka jest różnica?
Ponadto, po uruchomieniu ./executable
, używa bash lub sh?
Komentarze
Odpowiedź
To zależy od używanego systemu. Jeden z wielu systemów operacyjnych, zwłaszcza opartych na Linuksie, sh
jest linkiem do bash
.
W takim przypadku nadal istnieją pewne różnice w zachowaniu, w których bash
starają się przypominać tradycyjną powłokę Bourne, gdy nazywa się ją sh
, ale nadal akceptuje większość bashizmów.
W niektórych innych systemach operacyjnych, takich jak Debian, sh
jest zapewniane przez dash
, a nie bash
. To robi znacznie większą różnicę, ponieważ dash
nie obsługuje bashizmów, ponieważ zostało zaprojektowane jako czysta implementacja powłoki POSIX.
W zastrzeżonych systemach operacyjnych sh
jest często udostępniany przez zgodny z POSIX ksh88
, który podobnie jak dash
nie implementuje bashizmów. W systemie Solaris 10 i starszych, w zależności od Twojej PATH, sh
będzie prawdopodobnie starszą powłoką Bournea, starszą niż POSIX.
W każdym razie prawdopodobnie te same dane wyjściowe z testem tylko dlatego, że skrypt nie używał żadnego bash
polecenia, opcji lub składni.
Po uruchomieniu ./executable
, to jaka powłoka zostanie uruchomiona, zależy zasadniczo od shebang napisanego na początku skryptu .executable. To będzie bash
, jeśli shebang to określa:
#!/bin/bash ....
Jeśli nie ma shebanga i wywołujesz skrypt z powłoki zgodnej z POSIX, skrypt powinien być technicznie wykonywany przez pierwsze sh
znalezione w PATH. Wielu interpretatorów powłoki, takich jak bash
, dash
i ksh
, uważa się za POSIX, więc zinterpretować scenariusz. Zwróć uwagę, że zmienna środowiskowa SHELL
nie jest tutaj używana.
Komentarze
- Rozejrzałem się po
/bin
i stwierdziłem, żesh
jest dowiązaniem symbolicznym dodash
, a nie . Więc jak oni działali tak samo? Nie było to ' tak naprawdę nie uruchamiało żadnych poleceń skryptu basha, tylko polecenia terminala do korzystania z innych pakietów ' narzędzi. - Jeśli twój skrypt powłoki tylko sekwencyjnie wywołuje inne polecenia, każdy interpreter powłoki uruchomi go z takim samym wynikiem. Nie ma tu nic nieoczekiwanego.
- To nie jest ' związane z pytaniem, ale jaka dokładnie jest różnica między
bash
idash
? - Oba używają składni powłoki Bournea. Jak napisałem w mojej odpowiedzi,
dash
jest czystą implementacją standardu powłoki POSIX. Z drugiej stronybash
to powłoka z dość dużą liczbą rozszerzeń i niestandardowych funkcji, niektóre inspirowaneksh
,ksh93
i inne powłoki, a także niektóre powłoki specyficzne dla basha, znane jako bashizmy. Istnieje narzędzie o nazwie checkbashism, które pomaga zidentyfikować wszystko, co nie jest w pełni przenośne w danym skrypcie powłoki.
Odpowiedź
Tak, może być, ale nie musi. Dwie powłoki nie są takie same, ale podstawy są kompatybilne. Sprawdź ten post , aby uzyskać więcej informacji.
Możesz użyć następującego wiersza w skrypcie, aby sprawdzić używany interpreter:
ps h -p $$ -o args="" | cut -f1 -d" "
Możesz wyraźnie określić powłokę, która ma być używana, gdy skrypt jest wykonywany bezpośrednio za pomocą wiersza sheebang
:
#!/bin/sh
lub
#!/bin/bash
$SHELL
nie jest używana do decydowania, która powłoka zinterpretuje./executable
scenariusz. Nie musi też ' powiedzieć, jaka jest bieżąca powłoka.