Czy istnieje jakikolwiek Bash
shebang obiektywnie lepszy od innych do większości zastosowań?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- itp
Niegdyś pamiętam dawno temu, że dodanie kreski na końcu uniemożliwia komuś przekazanie polecenia do twojego skryptu, ale nie może znaleźć żadnych szczegółów na ten temat.
/usr/local/bin/bash
na OpenBSD.Odpowiedzi:
Powinieneś użyć
#!/usr/bin/env bash
dla przenośności : różne * nixy umieszczonebash
w różnych miejscach, a użycie/usr/bin/env
jest obejściem do uruchomienia pierwszegobash
znalezionego naPATH
. Ish
nie jestbash
.źródło
/bin/sh
itp.).bash
nie działa we/bin
wszystkich systemach.alias shebang='echo "#!/usr/bin/env bash"'
teraz muszę po prostu otworzyć terminal i wpisać shebang zamiast iść tutaj.env
jest na/usr/bin/env
. W rzeczywistości może być w/bin/env
dowolnym miejscu, o ile jest na ścieżce. Może być w,/dummy/env
jeśli/dummy
jest wPATH
. Sam Shebang jest niezdefiniowany w POSIX, więc mogłem#!stop toaster
uruchomić ekspres do kawy USB i być zgodny z POSIX. Więc#!/usr/bin/env bash
nie jest szczególnie lepszy niż#!/bin/bash
, może być mniej przenośny w zależności./usr/bin/env
Istnieje na większej liczbie komputerów niż na którymkolwiek z/bin/bash
Xorów/usr/bin/bash
, więc skrypt rozpoczynający się od tej linii wykona oczekiwaną czynność na jak największej liczbie komputerów./bin/sh
jest zwykle linkiem do domyślnej powłoki systemu, która często jestbash
włączona, ale np. systemy Debian mają mniejszą wagędash
. Tak czy inaczej, oryginalna powłoka Bourne'a jestsh
taka, więc jeśli twój skrypt używa pewnychbash
(2. generacji, „Bourne Again sh”) specyficznych funkcji ([[ ]]
testów, tablic, różnych słodkich rzeczy itp.), Powinieneś być bardziej szczegółowy i użyć później . W ten sposób w systemach, w których bash nie jest zainstalowany, twój skrypt nie będzie działał. Rozumiem, że może być ekscytująca trylogia filmów o tej ewolucji ... ale to może być słyszenie.Zauważ też, że gdy wywoływany jako
sh
,bash
do pewnego stopnia zachowuje się jak standard POSIXsh
(zobacz także dokumentację GNU na ten temat).źródło
/bin/sh
z nigdzie indziej,/usr
ponieważ utrudniłoby to uruchamianie skryptów init przed/usr
zamontowaniem./bin
i/sbin
przez lata właśnie zostały dowiązania domyślnie, aby/usr/bin
i/usr/sbin
tak w tym kontekście/bin/sh
jest link dobash
a rzeczywistą katalog jest/usr/bin
. Ale poprawię powyższe.Polecam użycie:
Nie jest w 100% przenośny (niektóre systemy umieszczają
bash
w lokalizacji innej niż/bin
), ale fakt, że wiele istniejących skryptów używa#!/bin/bash
presji różnych systemów operacyjnych, aby stworzyć/bin/bash
przynajmniej dowiązanie symboliczne do głównej lokalizacji.Alternatywa dla:
zostało zasugerowane - ale nie ma gwarancji, że
env
polecenie jest w/usr/bin
(i użyłem systemów, których nie ma). Ponadto w tym formularzu będzie używana pierwsza instancjabash
obecnych użytkowników$PATH
, która może nie być odpowiednią wersją powłoki bash.(Ale
/usr/bin/env
powinien działać na każdym dość nowoczesnym systemie, ponieważenv
jest w/usr/bin
systemie lub dlatego, że system robi coś, co sprawia, że działa. System, o którym mówiłem powyżej, to SunOS 4, którego prawdopodobnie nie używałem od około 25 lat.)Jeśli potrzebujesz skryptu, aby działał w systemie, który go nie ma
/bin/bash
, możesz zmodyfikować skrypt, aby wskazywał właściwą lokalizację (co jest oczywiście niewygodne).Bardziej szczegółowo omówiłem kompromisy w mojej odpowiedzi na to pytanie .
Trochę niejasna aktualizacja: jeden system, którego używam, Termux , warstwa podobna do Linuksa, która działa pod Androidem, nie ma
/bin/bash
(bash
jest/data/data/com.termux/files/usr/bin/bash
) - ale ma specjalną obsługę do obsługi#!/bin/bash
.źródło
Użycie linii shebang do wywołania odpowiedniego tłumacza jest nie tylko dla BASH. Możesz użyć shebang dla dowolnego języka interpretowanego w twoim systemie, takiego jak Perl, Python, PHP (CLI) i wiele innych. Nawiasem mówiąc, shebang
(mogą to być również dwa myślniki, tj.
--
) kończy opcje bash wszystko później będzie traktowane jako nazwy plików i argumenty.Użycie
env
polecenia sprawia, że skrypt jest przenośny i umożliwia konfigurację niestandardowych środowisk dla skryptu, dlatego należy używać przenośnych skryptówLub dla dowolnego języka, takiego jak Perl
Pamiętaj, aby spojrzeć na
man
strony dlabash
:i
env
:Uwaga: W systemach Debian i systemach opartych na Debianie, takich jak Ubuntu,
sh
jest to powiązane zdash
notbash
. Jak używają wszystkie skrypty systemowesh
. To pozwala bashowi rosnąć i system pozostaje stabilny, zgodnie z Debianem.Ponadto, aby zachować wywołanie * nix, tak jak nigdy nie używam rozszerzeń plików w skryptach wywoływanych przez shebang, ponieważ nie można pominąć rozszerzenia wywołania w plikach wykonywalnych, jak to możliwe w systemie Windows. Polecenie file może zidentyfikować go jako skrypt.
źródło
To naprawdę zależy od tego, jak piszesz skrypty bash. Jeśli twój
/bin/sh
jest symlinkowany do bash, kiedy bash jest wywoływany jakosh
, niektóre funkcje są niedostępne .Jeśli chcesz funkcji specyficznych dla basha, nie POSIX-owych, użyj
#!/bin/bash
źródło
pkg_add
, to znajduje się w/usr/local/bin
, co może nie być na drodze.POSIX
funkcją?