Jaka jest różnica między #!/ bin / sh i #!/ bin / bash?

na Linuksie i innych systemach uniksopodobnych masz do wyboru wiele powłok.

powłoka jest odpowiedzialna nie tylko za rysowanie małych znaków zachęty, ale za interpretowanie poleceń, zwłaszcza jeśli wprowadzasz skomplikowaną logikę, taką jak rury, warunki itp.

bash jest najczęściej używaną powłoką domyślną dla użytkowników Systemów Linux. Jest duchowym potomkiem innych powłok używanych w całej historii Uniksa. Jego nazwa, bash jest skrótem Bourne-Again Shell, hołdem dla powłoki Bourne ’ a, którą został zaprojektowany, aby zastąpić, choć zawiera również funkcje z powłoki C i powłoki Korn.

jest uruchomiony, w dzisiejszych czasach, od /bin/bash – każdy system z bashem będzie miał go dostępny tutaj.

jednak nie tylko użytkownicy używają powłok. Skrypty (skrypty powłoki) potrzebują powłoki do ich interpretacji. Podczas uruchamiania skryptu powłoki system musi uruchomić proces powłoki, aby wykonać skrypt.

problem polega na tym, że różne powłoki mają małe niespójności między nimi, a jeśli chodzi o uruchamianie skryptów, mogą to być prawdziwe problemy. bash ma sporo funkcji skryptowych, które są unikalne tylko dla Basha, a nie dla innych powłok. To jest w porządku, jeśli zawsze będziesz używać bash do uruchamiania tych skryptów. Inne powłoki mogą próbować emulować Basha lub stosować się do standardu POSIX, który bash całkiem dobrze obsługuje (choć dodaje własne rozszerzenia).

na górze skryptu powłoki można określić, z jaką powłoką ma być uruchomiony przy użyciu shebang. Skrypt może określić #!/bin/bash w pierwszej linii, co oznacza, że skrypt powinien być zawsze uruchamiany w bash, a nie w innej powłoce.

/bin/sh jest plikiem wykonywalnym reprezentującym powłokę systemową. W rzeczywistości jest on zwykle implementowany jako dowiązanie symboliczne wskazujące na plik wykonywalny dla dowolnej powłoki, która jest powłoką systemową. Powłoka systemowa jest rodzajem domyślnej powłoki, której powinny używać Skrypty systemowe. W dystrybucjach Linuksa przez długi czas było to zazwyczaj dowiązanie symboliczne do Basha, tak bardzo, że stało się pewnego rodzaju konwencją, aby zawsze łączyć /bin/sh z bashem lub powłoką kompatybilną z bash. Jednak w ciągu ostatnich kilku lat Debian (i Ubuntu) zdecydowały się zmienić powłokę systemową z bash na dash – podobną powłokę – zrywającą z długą tradycją w Linuksie (cóż, GNU) używania bash dla /bin/sh. Dash jest postrzegany jako lżejsza i znacznie szybsza powłoka, która może być korzystna dla szybkości uruchamiania (i innych rzeczy, które wymagają wielu skryptów powłoki, takich jak skrypty instalacyjne pakietów).

Dash jest dość dobrze kompatybilny z bashem, bazując na tym samym standardzie POSIX. Jednak nie implementuje rozszerzeń specyficznych dla bash. Istnieją skrypty, które używają #!/bin/sh (powłoki systemowej) jako swojego shebang, ale które wymagają rozszerzeń specyficznych dla Basha. Jest to obecnie uważane za błąd, który powinien zostać naprawiony przez Debiana i Ubuntu, które wymagają /bin/sh, aby móc działać, gdy wskazuje się na dash.

mimo że powłoka systemu Ubuntu wskazuje na dash, twoja powłoka logowania jako użytkownik nadal jest bash w tym czasie. Oznacza to, że po zalogowaniu się do emulatora terminala w dowolnym miejscu w Linuksie, twoja powłoka logowania będzie bash. Szybkość działania nie stanowi większego problemu, gdy powłoka jest używana interaktywnie, a użytkownicy są zaznajomieni z bashem (i mogą mieć specyficzne dla Basha dostosowania w swoim katalogu domowym).

czego powinieneś używać podczas pisania skryptów

jeśli twój skrypt wymaga funkcji obsługiwanych tylko przez bash, użyj #!/bin/bash.

ale jeśli to w ogóle możliwe, dobrze byłoby upewnić się, że skrypt jest zgodny z POSIX i użyć #!/bin/sh, co zawsze, całkiem niezawodnie, powinno wskazywać na preferowaną powłokę systemową zgodną z POSIX w każdej instalacji.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.