Pytanie w sprawie bash, shebang – Jaki jest preferowany shebang Bash?

904

Czy jest jakiśBash shebang obiektywnie lepiej niż inne do większości zastosowań?

#!/usr/bin/env bash#!/bin/bash#!/bin/sh#!/bin/sh -itp

Przypominam sobie, jak dawno temu słyszałem, że dodanie kreski na końcu uniemożliwia komuś przekazanie polecenia do skryptu, ale nie można znaleźć żadnych szczegółów na ten temat.

I jego/usr/local/bin/bash w OpenBSD. jww

Twoja odpowiedź

5   odpowiedzi
1231

#!/usr/bin/env bash dlaruchliwość: wstawiono różne * nixybash w różnych miejscach i za pomocą/usr/bin/env jest obejściem do uruchomienia pierwszegobash znaleziono naPATH. Ish nie jestbash.

^^ Ścieżka Windows Git Bash to/ user / bin / bash, ale moja ścieżka hostingowa Siteground to/ bin / bash (sprawdzone zecho $SHELL). Leo
Przenoszenie @darkfeline nie jest absolutne - matematycznie niemożliwe jest wykonanie dowolnego skryptu, który zrobi to samo na każdej platformie. Od 2012 r. Do 2018 r/usr/bin/env istnieje na większej liczbie maszyn niż którykolwiek z nich/bin/bash xor/usr/bin/bash, więc skrypt, który zaczyna się od tej liniiwykonuj oczekiwaną rzecz na jak największej liczbie maszyn. l0b0
@ I0b0 To zrobi oczekiwaną rzeczjeśli mam właściwą wersję na mojej ścieżce. Nie mogę określić, czy mój skrypt potrzebujebash 4.2 lub później używając shebang; Mogę tylko udokumentować ten wymóg. Naprawdę, scenarzysta nie powinien być tym, który kontroluje shebang; to powinna być osobabieganie scenariusz. Python robi to dobrze, używa IMO: skrypty#!python, a instalator zastąpi go poprawnym shebangiem dla systemu docelowego. chepner
@ l0b0 Właściwie przenośność może być bezwzględna w POSIX. Zakładając oczywiście, że Bash jest na ścieżce, możesz użyć takiego skryptuto. Plik wykonywalny bez shebang i nie pasujący do binarnego formatu wykonywalnego jest uruchamiany za pomocą sh. To jest w pełni przenośne w POSIX, w przeciwieństwie do tej odpowiedzi. (Przepraszam za podwójny komentarz, głupia edycja komentarzy StackOverflow). darkfeline
68

/bin/sh jest zwykle linkiem do domyślnej powłoki systemu, która często jestbash ale na przykład systemy Debian są lżejszedash. Tak czy inaczej, oryginalna powłoka Bourne'a jestsh, więc jeśli twój skrypt korzysta z niektórychbash (2. generacji, „Bourne Again sh”) specyficzne funkcje ([[ ]] testy, tablice, różne słodycze itp.), wtedy powinieneś być bardziej szczegółowy i użyć późniejszego. W ten sposób w systemach, w których bash nie jest zainstalowany, skrypt nie zostanie uruchomiony. Rozumiem, że może być ekscytująca trylogia filmów o tej ewolucji ... ale to może być pogłoska.

Zauważ również, że gdy wywołany jakosh, bash do pewnego stopniazachowuje się jak standard POSIX sh (Zobacz teżdokumenty GNU o tym).

Powłoka Public Domain Korn (pdksh) jest domyślna w OpenBSD. jww
@aij Nie wiem, dlaczego umieszczam tam „wiele lub większość” - jestem użytkownikiem fedora, gdzie/bin i/sbin od lat są domyślnie dowiązaniami symbolicznymi do/usr/bin i/usr/sbin, więc w tym kontekście/bin/sh jest linkiem dobash a rzeczywisty katalog to/usr/bin. Ale poprawię powyższe. delicateLatticeworkFever
Większość systemów to zrobinie połączyć/bin/sh do dowolnego miejsca/usr ponieważ byłoby to trudne do uruchomienia skryptów inicjujących/usr jest zamontowany. aij
„Mogę pisać płasko przez pół mili, zanim moje ręce zaczną się trząść”. xdhmoore
7

Polecam:

<code>#!/bin/bash
</code>

Nie jest w 100% przenośny (w niektórych systemach miejscebash w miejscu innym niż/bin), ale fakt, że wiele istniejących skryptów używa#!/bin/bash presje na różne systemy operacyjne/bin/bash przynajmniej dowiązanie symboliczne do głównej lokalizacji.

Alternatywa:

<code>#!/usr/bin/env bash
</code>

został zasugerowany - ale nie ma gwarancji, żeenv polecenie jest włączone/usr/bin (i używałem systemów tam, gdzie nie jest). Ponadto ten formularz użyje pierwszego wystąpieniabash w obecnych użytkownikach$PATH, która może nie być odpowiednią wersją powłoki bash.

Jeśli potrzebujesz skryptu do uruchomienia w systemie, który nie ma/bin/bash, możesz zmodyfikować skrypt tak, aby wskazywał właściwą lokalizację (co jest oczywiście niewygodne).

Bardziej szczegółowo omówiłem kompromisymoja odpowiedź doto pytanie.

17

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

<code>#!/bin/sh -
</code>

(może to być również dwie kreski, tj.--) kończy opcje basha wszystko po będzie traktowane jako nazwy plików i argumenty.

Używającenv polecenie sprawia, że ​​skrypt jest przenośny i pozwala na ustawienie niestandardowych środowisk dla skryptu, dlatego powinny być używane przenośne skrypty

<code>#!/usr/bin/env bash
</code>

Lub w jakimkolwiek języku takim jak Perl

<code>#!/usr/bin/env perl
</code>

Pamiętaj, aby spojrzeć naman strony dlabash:

<code>man bash
</code>

ienv:

<code>man env
</code>

Uwaga: W systemach opartych na Debianie i Debianie, takich jak Ubuntu,sh jest połączony zdash niebash. Jak wszystkie skrypty systemowesh. Dzięki temu bash rośnie, a system pozostaje stabilny, zgodnie z Debianem.

Ponadto, aby zachować wywołanie * nix tak, jak nigdy, nie używaj rozszerzeń plików w skryptach wywoływanych przez shebang, ponieważ nie można pominąć rozszerzenia przy wywołaniu na plikach wykonywalnych, tak jak w systemie Windows. Polecenie file może zidentyfikować go jako skrypt.

3

/bin/sh jest dowiązany do bash, gdy bash jest wywoływany jakosh, niektóre funkcje są niedostępne.

Jeśli chcesz specyficznych dla basha, nie-POSIX-owych funkcji, użyj#!/bin/bash

Bash nie jest zainstalowany w OpenBSD. Jeśli zainstalujesz go przezpkg_add, a następnie znajduje się w/usr/local/bin, które mogą nie być na ścieżce. jww

Powiązane pytania