Zawsze możesz użyć dowiązania symbolicznego, ponieważ /bin/shw większości przypadków na Linuksie jest to już dowiązanie symboliczne bash. /bin/sh
Tyle,
5
Teraz, gdy masz odpowiedź, że może mieszkać gdziekolwiek chce, możesz zadać sobie pytanie: jak możesz przenośnie napisać linię shebang sh? Odpowiedź brzmi: shebang również nie jest częścią POSIX, więc problem nawet się nie pojawia.
Jörg W Mittag
1
@ JörgWMittag Tak, czasem zaskakuje, jak wiele rzeczy, które uważamy za „standardowe” funkcje uniksowe, nie są w rzeczywistości wymagane przez POSIX.
Barmar
1
To, czy użyjesz shebang, jest niezależne od tego, czy ścieżka /bin/shmusi istnieć w systemie POSIX.
chepner
Przynajmniej w systemach pochodzących z Ubuntu /bin/shjest link do dash. Na BSD /bin/shnie jest to łącze, ale osobny plik wykonywalny, a na pewno nie bash.
Rhialto obsługuje Monikę
Odpowiedzi:
22
POSIX nakazuje tylko /devi /tmpkatalogi istnieć , a /dev/null, /dev/ttyi /dev/consolepliki. Standardowe narzędzia muszą istnieć, ale nie określono konkretnej lokalizacji. Może nie być /binwcale, a jeśli tak, to może nie zawierać a sh, a jeśli tak, to nie może być POSIX sh.
Możesz uzyskać poprawną PATHzmienną, która zawiera narzędzia POSIX, w tym shza pomocą getconfpolecenia :
Re Solaris: ... chyba że korzystasz z instalacji małego serwera Solaris, która pomija wiele narzędzi POSIX. Zobacz unix.stackexchange.com/q/360359/135943
Wildcard
„Bezużyteczne”? Wolę nazwać ich zbędnymi.
Mukesh Sai Kumar
2
więc jak znaleźć getconf?
Joshua
@MukeshSaiKumar samodzielne polecenie „cd” nigdy nie może działać
OrangeDog
Cóż, to będzie „pracy” tylko dla wartości pracy, która, powiedzmy, testy czy można zmienić do katalogu, ale w rzeczywistości nie opuszczają proces, który go nazwie istnieje. To jednak więcej funkcjonalności niż żadna.
Charles Duffy
12
Nie, to nie jest wymagane sh, aby być w /bin. To wyraźnie cytuje /bin, /usr/bini /usr/xpg4/binjako możliwe lokalizacje. Specyfikacja POSIX wymaga tylko, aby shbyła w zmiennej PATH.
Wnioski należy pamiętać, że średnia ścieżka do zbiornika nie można przyjąć, aby być /bin/shalbo /usr/bin/shi powinna być określona przez przesłuchaniu ścieżki zwracanej przez getconf PATH, upewniając się, że wrócił ścieżka jest absolutna ścieżka a nie powłoki wbudowanej.
Na przykład, aby określić lokalizację standardowego narzędzia sh:
Jak powiedzieli inni tutaj, nie jest to bezwzględnie wymagane dla zgodności z POSIX.
Ale prawdopodobnie kompatybilność z istniejącym oprogramowaniem jest o wiele ważniejsza (w końcu celem POSIX jest, aby pewne rzeczy działały na wszystkich zgodnych systemach operacyjnych), a jeśli system operacyjny nie zapewnia sh /bin/sh, to zepsuje niektóre rzeczy.
Innym sposobem, w jaki niektóre historyczne implementacje obsługują skrypty powłoki, jest rozpoznanie pierwszych dwóch bajtów pliku jako ciągu znaków „#!” i użycie pozostałej części pierwszego wiersza pliku jako nazwy interpretera poleceń do wykonania.
Ale jeśli to nie jest obsługiwane, wiele istniejących programów ulegnie awarii lub będzie wymagać dodatkowej pracy w celu przeniesienia.
/bin/sh
w większości przypadków na Linuksie jest to już dowiązanie symbolicznebash
./bin/sh
sh
? Odpowiedź brzmi: shebang również nie jest częścią POSIX, więc problem nawet się nie pojawia./bin/sh
musi istnieć w systemie POSIX./bin/sh
jest link dodash
. Na BSD/bin/sh
nie jest to łącze, ale osobny plik wykonywalny, a na pewno niebash
.Odpowiedzi:
POSIX nakazuje tylko
/dev
i/tmp
katalogi istnieć , a/dev/null
,/dev/tty
i/dev/console
pliki. Standardowe narzędzia muszą istnieć, ale nie określono konkretnej lokalizacji. Może nie być/bin
wcale, a jeśli tak, to może nie zawierać ash
, a jeśli tak, to nie może być POSIXsh
.Możesz uzyskać poprawną
PATH
zmienną, która zawiera narzędzia POSIX, w tymsh
za pomocągetconf
polecenia :Może to być przydatne na przykład w systemie
sh
Solaris, gdzie domyślnie nie jest kompatybilny z POSIX , ale jest zgodnysh
i dostępny w ten sposób (ponieważ Solaris jest certyfikowanym Uniksem ).getconf PATH
będzie zawierał/usr/xpg4/bin
z przodu, który zawiera POSIXsh
i szereg innych wymaganych narzędzi (w tym takich bezużytecznych, jakcd
).źródło
Nie, to nie jest wymagane
sh
, aby być w/bin
. To wyraźnie cytuje/bin
,/usr/bin
i/usr/xpg4/bin
jako możliwe lokalizacje. Specyfikacja POSIX wymaga tylko, abysh
była w zmiennej PATH.Specyfikacja POSIX określa:
źródło
Jak powiedzieli inni tutaj, nie jest to bezwzględnie wymagane dla zgodności z POSIX.
Ale prawdopodobnie kompatybilność z istniejącym oprogramowaniem jest o wiele ważniejsza (w końcu celem POSIX jest, aby pewne rzeczy działały na wszystkich zgodnych systemach operacyjnych), a jeśli system operacyjny nie zapewnia sh
/bin/sh
, to zepsuje niektóre rzeczy.Najwyraźniej skrypty
#!/bin/sh
oparte na tej ścieżce są standaryzowane. Nie jest to wymagane do działania; POSIX nie wymaga nawet#!
obsługiwania linii, chociaż wspomina, że taka funkcjonalność jest powszechna :Ale jeśli to nie jest obsługiwane, wiele istniejących programów ulegnie awarii lub będzie wymagać dodatkowej pracy w celu przeniesienia.
źródło