Skip to content

Kiedy lepiej używać #!/bin/bash zamiast #!/bin/sh w skrypcie powłoki?

25 de lipiec de 2021
when is it better to use bin bash instead of bin sh in a shell script 00

Kiedy tworzysz nowy skrypt powłoki, chcesz się upewnić, że jest jak najbardziej bezproblemowy, ale czasami może być trochę mylące, aby wiedzieć, który z nich jest najlepszy do użycia. W tej notatce dzisiejszy post z pytaniami i odpowiedziami dla SuperUser zawiera odpowiedź na pytanie zdezorientowanego czytelnika.

Dzisiejsza sesja pytań i odpowiedzi przychodzi do nas dzięki uprzejmości SuperUser — pododdziału Stack Exchange, społecznościowej grupy witryn internetowych z pytaniami i odpowiedziami.

Pytanie

Czytnik SuperUser Hendre chce wiedzieć, kiedy lepiej używać #!/kosz/bash zamiast #!/kosz/sz w skryptach powłoki:

Kiedy jest bardziej odpowiednie w użyciu? #!/kosz/bash zamiast #!/kosz/sz w skrypcie powłoki?

Kiedy lepiej użyć #!/kosz/bash zamiast #!/kosz/sz w skrypcie powłoki?

Odpowiedź

Grawitacja współtwórcy SuperUser ma dla nas odpowiedź:

W skrócie:

  • Istnieje kilka powłok, które implementują nadzbiór Specyfikacja POSIX sh. W różnych systemach, /bin/sz może być linkiem do ash, bash, dash, ksh, zsh itp. Zawsze będzie jednak kompatybilny z sh, nigdy z csh lub fish.
  • Dopóki trzymasz się tylko funkcji sh, możesz (a prawdopodobnie nawet powinieneś) używać #!/kosz/sz a skrypt powinien działać poprawnie, bez względu na to, która to powłoka.
  • Jeśli zaczynasz używać funkcji specyficznych dla basha (tj. tablic), powinieneś wyraźnie poprosić o bash, ponieważ nawet jeśli /bin/sz już wywołuje bash w twoim systemie, może nie być w systemie wszystkich innych, a twój skrypt nie będzie tam działał. To samo dotyczy oczywiście zsh i ksh.
  • Nawet jeśli skrypt jest przeznaczony wyłącznie do użytku osobistego, możesz zauważyć, że niektóre systemy operacyjne się zmieniają /bin/sz podczas aktualizacji. Na przykład w Debianie był to bash, ale później został zastąpiony bardzo minimalnym myślnikiem. Skrypty, które wykorzystywały bashizmy, ale miały #!/kosz/sz nagle się zepsuł.

Jednakże:

  • Nawet #!/kosz/bash nie jest poprawne. Na różnych systemach bash może żyć w /usr/bin, /usr/pkg/bin, lub /usr/local/bin.
  • Bardziej niezawodną opcją jest #!/usr/bin/env bash, którego używa $PATH. Chociaż samo narzędzie env również nie jest ściśle gwarantowane, /usr/bin/env nadal działa na większej liczbie systemów niż /bin/bash robi.

Masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych doświadczonych technologicznie użytkowników Stack Exchange? Sprawdź pełny wątek dyskusji tutaj.

Źródło obrazu: Wikipedia

Czy ten post był pomocny?