Вы всегда можете использовать символическую ссылку, поскольку /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команды :
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.
Приложения должны учитывать, что нельзя считать, что стандартный PATH для оболочки является /bin/shили /usr/bin/sh, и должен определяться путем запроса PATH, возвращаемого getconf PATH, гарантируя, что возвращаемый путь является абсолютным путем, а не встроенной в оболочку.
Например, чтобы определить местоположение стандартной утилиты sh:
Как уже говорили другие, это не является обязательным требованием для соответствия POSIX.
Но, возможно, совместимость с существующим программным обеспечением гораздо важнее (в конце концов, цель POSIX состоит в том, чтобы определенные вещи работали на всех соответствующих операционных системах), и если ОС не обеспечивает sh /bin/sh, это сломает некоторые вещи.
Другой способ, которым некоторые исторические реализации обрабатывают сценарии оболочки, - это распознавание первых двух байтов файла как строки символов "#!" и использование оставшейся части первой строки файла в качестве имени интерпретатора команды для выполнения.
Но если это не поддерживается, большая часть существующего программного обеспечения сломается или потребует дополнительной работы для переноса.
/bin/sh
, в большинстве случаев в Linux, она уже является символической ссылкойbash
. Просто многие сценарии используют жестко/bin/sh
sh
? И ответ таков: shebang также не является частью POSIX, поэтому проблема даже не представляет себя./bin/sh
должен ли путь существовать в системе POSIX./bin/sh
есть ссылка наdash
. На BSD/bin/sh
это не ссылка, а отдельный исполняемый файл, и, конечно, нетbash
.Ответы:
POSIX мандатов только
/dev
и/tmp
каталоги существовать , и/dev/null
,/dev/tty
и/dev/console
файлы. Стандартные утилиты должны существовать, но не указывается конкретное местоположение. Может вообще не быть/bin
, и если он есть, он может не содержатьsh
, и если это так, то это может не быть POSIXsh
.Вы можете получить действительную
PATH
переменную, которая включает в себя инструменты POSIX, в том числеsh
, с помощьюgetconf
команды :Это может быть полезно, например, в Solaris, где значение по умолчанию
sh
не является POSIX-совместимым , но обеспечивается совместимостьsh
и доступ к нему таким образом (поскольку Solaris является сертифицированным Unix ).getconf PATH
будет включать/usr/xpg4/bin
в себя спереди, который содержит POSIXsh
и ряд других необходимых инструментов (в том числе бесполезных, таких какcd
).источник
Нет, это не обязательно,
sh
чтобы быть в/bin
. Он явно цитирует/bin
,/usr/bin
и в/usr/xpg4/bin
качестве возможных мест. Спецификация POSIX требует только того, чтобыsh
быть в PATH.Спецификация POSIX гласит:
источник
Как уже говорили другие, это не является обязательным требованием для соответствия POSIX.
Но, возможно, совместимость с существующим программным обеспечением гораздо важнее (в конце концов, цель POSIX состоит в том, чтобы определенные вещи работали на всех соответствующих операционных системах), и если ОС не обеспечивает sh
/bin/sh
, это сломает некоторые вещи.Очевидно, что сценарии,
#!/bin/sh
использующие этот путь, стандартизированы. Это не обязательно для работы; POSIX даже не требует поддержки#!
строк, хотя упоминает, что такая функциональность является обычной :Но если это не поддерживается, большая часть существующего программного обеспечения сломается или потребует дополнительной работы для переноса.
источник