Jaka jest różnica między używaniem bash i sh do uruchomienia skryptu?

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

  • @Pandya Zmienna $SHELL nie jest używana do decydowania, która powłoka zinterpretuje ./executable scenariusz. Nie musi też ' powiedzieć, jaka jest bieżąca powłoka.
  • @jlliagre oh! ok. wiki.debian.org mówi " SHELL = Bieżąca powłoka. "
  • @Pandya powinno właściwie brzmieć " Użytkownik ' s powłoka logowania ". Bieżąca powłoka może być inna.

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, że sh jest dowiązaniem symbolicznym do dash, 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 i dash?
  • Oba używają składni powłoki Bournea. Jak napisałem w mojej odpowiedzi, dash jest czystą implementacją standardu powłoki POSIX. Z drugiej strony bash to powłoka z dość dużą liczbą rozszerzeń i niestandardowych funkcji, niektóre inspirowane ksh, 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 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *