Должен ли «sh» находиться в каталоге «/ bin»?


16

Я читал, что POSIX-совместимые операционные системы (например, Linux) должны иметь shоболочку.

Но это обязательно для того, shчтобы быть в /binкаталоге, или это может быть в любом каталоге?


Вы всегда можете использовать символическую ссылку, поскольку /bin/sh, в большинстве случаев в Linux, она уже является символической ссылкой bash. Просто многие сценарии используют жестко /bin/sh
запрограммированный код

5
Теперь, когда у вас есть ответ, что он может жить где угодно, вы можете спросить себя: как тогда вы можете написать переносную строку Шебанга sh? И ответ таков: shebang также не является частью POSIX, поэтому проблема даже не представляет себя.
Йорг Миттаг

1
@ JörgWMittag Да, иногда удивительно, как много вещей, которые мы считаем «стандартными» функциями Unix, на самом деле не требуются POSIX.
Бармар

1
Используете ли вы shebang или нет, не зависит от того, /bin/shдолжен ли путь существовать в системе POSIX.
chepner

По крайней мере, в системах, производных от Ubuntu, /bin/shесть ссылка на dash. На BSD /bin/shэто не ссылка, а отдельный исполняемый файл, и, конечно, нет bash.
Риальто поддерживает Монику

Ответы:


22

POSIX мандатов только /devи /tmpкаталоги существовать , и /dev/null, /dev/ttyи /dev/consoleфайлы. Стандартные утилиты должны существовать, но не указывается конкретное местоположение. Может вообще не быть /bin, и если он есть, он может не содержать sh, и если это так, то это может не быть POSIX sh.

Вы можете получить действительную PATHпеременную, которая включает в себя инструменты POSIX, в том числе sh, с помощью getconfкоманды :

$ PATH=$(getconf PATH)
$ sh

Это может быть полезно, например, в Solaris, где значение по умолчанию shне является POSIX-совместимым , но обеспечивается совместимость shи доступ к нему таким образом (поскольку Solaris является сертифицированным Unix ). getconf PATHбудет включать /usr/xpg4/binв себя спереди, который содержит POSIX shи ряд других необходимых инструментов (в том числе бесполезных, таких какcd ).


Re Solaris: ... если только вы не используете установку Solaris "маленький сервер", в которой отсутствуют многие инструменты POSIX. См. Unix.stackexchange.com/q/360359/135943
Подстановочный

«Бесполезные»? Я бы лучше назвал их излишними.
Мукеш Сай Кумар

2
так как найти getconf?
Джошуа

@MukeshSaiKumar отдельная команда 'cd' не может работать никогда
OrangeDog

Ну, это будет «работать» только для значения работы, которое, скажем, проверяет, можете ли вы перейти в каталог, но на самом деле не оставляет процесс, который его вызвал. Это больше функциональность, чем вообще ничего.
Чарльз Даффи

12

Нет, это не обязательно, shчтобы быть в /bin. Он явно цитирует /bin, /usr/binи в /usr/xpg4/binкачестве возможных мест. Спецификация POSIX требует только того, чтобы shбыть в PATH.

Спецификация POSIX гласит:

Приложения должны учитывать, что нельзя считать, что стандартный PATH для оболочки является /bin/shили /usr/bin/sh, и должен определяться путем запроса PATH, возвращаемого getconf PATH, гарантируя, что возвращаемый путь является абсолютным путем, а не встроенной в оболочку.

Например, чтобы определить местоположение стандартной утилиты sh:

command -v sh

В некоторых реализациях это может вернуть:

/usr/xpg4/bin/sh


2

Как уже говорили другие, это не является обязательным требованием для соответствия POSIX.

Но, возможно, совместимость с существующим программным обеспечением гораздо важнее (в конце концов, цель POSIX состоит в том, чтобы определенные вещи работали на всех соответствующих операционных системах), и если ОС не обеспечивает sh /bin/sh, это сломает некоторые вещи.

Очевидно, что сценарии, #!/bin/shиспользующие этот путь, стандартизированы. Это не обязательно для работы; POSIX даже не требует поддержки #!строк, хотя упоминает, что такая функциональность является обычной :

Другой способ, которым некоторые исторические реализации обрабатывают сценарии оболочки, - это распознавание первых двух байтов файла как строки символов "#!" и использование оставшейся части первой строки файла в качестве имени интерпретатора команды для выполнения.

Но если это не поддерживается, большая часть существующего программного обеспечения сломается или потребует дополнительной работы для переноса.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.