sh
(или язык команд оболочки )— это язык программирования, описанный POSIX. стандарт . Имеет множество реализаций (ksh88
, dash
,... ). bash
также может быть считается реализациейsh
(см. ниже ).
Поскольку sh
— это спецификация, а не реализация, /bin/sh
— символическая ссылка. (или жесткая ссылка )на фактическую реализацию в большинстве систем POSIX.
bash
начинался какsh
-совместимая реализация (, хотя она предшествовала стандарту POSIX на несколько лет ), но с течением времени она приобрела множество расширений. Многие из этих расширений могут изменить поведение допустимых сценариев оболочки POSIX, поэтому сам по себе bash
не является допустимой оболочкой POSIX. Скорее, это диалект языка оболочки POSIX.
bash
поддерживает переключатель --posix
, что делает его более совместимым с POSIX -. Он также пытается имитировать POSIX, если вызывается как sh
.
Долгое время /bin/sh
указывал на /bin/bash
в большинстве систем GNU/Linux. В результате стало почти безопасно игнорировать разницу между ними. Но это начало меняться в последнее время.
Некоторые популярные примеры систем, в которых /bin/sh
не указывает на/bin/bash
(и на некоторых из которых /bin/bash
может даже не существовать ), являются:
sh
на dash
; initramfs
. Он использует реализацию оболочки ash
. pdksh
, потомок оболочки Korn. FreeBSD sh
является потомком оригинальной оболочки UNIX Bourne. У Solaris есть собственный sh
, который долгое время не был совместим с POSIX -; бесплатная реализация доступна в проекте Heirloom .Как узнать, на что указывает /bin/sh
в вашей системе?
Сложность заключается в том, что /bin/sh
может быть символической ссылкой или жесткой ссылкой. Если это символическая ссылка, переносимый способ ее разрешения:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Если это жесткая ссылка, попробуйте
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
Фактически, флаг -L
распространяется как на символические, так и на жесткие ссылки. но недостаток этого метода в том, что он не переносимый — POSIX не требуетfind
для поддержки опции -samefile
, хотя и GNU find , и FreeBSD find поддерживают его.
В конце концов, вам решать, какой из них использовать, написав строку «shebang».
.
#!/bin/sh
будет использоватьsh
(и что бы это ни случилось, чтобы указать на ),
#!/bin/bash
будет использовать /bin/bash
, если он доступен (, и выдаст сообщение об ошибке, если он не ). Конечно, вы также можете указать другую реализацию, например.
#!/bin/dash
Для собственных сценариев я предпочитаю sh
по следующим причинам:
bash
, они должны иметьsh
Использование bash
также имеет свои преимущества. Его функции делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие вещи, как локальные переменные с областью действия и массивы. Plain sh
— очень минималистичный язык программирования.
Переадресация агента совместима с общим доступом к соединению. Они взаимодействуют друг с другом в том смысле, что переадресация агента происходит только в главном соединении. Ведомое соединение не выполняет переадресацию агента, потому что нет смысла снова пересылать агента, если мастер уже сделал это. Вы получите одинаковое значение SSH_AUTH_SOCK
во всех соединениях, выполненных через одно и то же основное соединение.
Здесь, должно быть, произошло то, что вы включили совместное использование соединения, а затем запустили главное соединение без переадресации агента, либо потому, что у вас была отключена переадресация агента в то время, либо потому, что вы запустили основное соединение из контекста, в котором SSH_AUTH_SOCK
не устанавливается на клиенте. Затем вы создали подчиненное соединение, прикрепленное к этому главному соединению.
Закройте главное соединение и запустите новое, убедившись, что оно работает в контексте, где у него есть доступ к агенту (, например. не задание cron, где SSH_AUTH_SOCK
не определено ).