Czy „sh” musi znajdować się w katalogu „/ bin”?

16

Przeczytałem, że systemy operacyjne zgodne z POSIX (na przykład: Linux) muszą mieć shpowłokę.

Ale czy musi shbyć w /binkatalogu, czy może znajdować się w dowolnym katalogu?

użytkownik270294
źródło
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 :

$ PATH=$(getconf PATH)
$ sh

Może to być przydatne na przykład w systemiesh Solaris, gdzie domyślnie nie jest kompatybilny z POSIX , ale jest zgodny shi dostępny w ten sposób (ponieważ Solaris jest certyfikowanym Uniksem ). getconf PATHbędzie zawierał /usr/xpg4/binz przodu, który zawiera POSIX shi szereg innych wymaganych narzędzi (w tym takich bezużytecznych, jakcd ).

Michael Homer
źródło
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.

Specyfikacja POSIX określa:

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:

command -v sh

W niektórych implementacjach może to zwrócić:

/usr/xpg4/bin/sh

John1024
źródło
2

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/shoparte 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 :

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.

Ian D. Scott
źródło