Какова цель команды sh
когда она используется в интерактивном режиме и внутри скрипта bash?
Другие , чем на хэш взрыва линии (первая линия) должна sh
когда - либо заменить bash
на Баш системе?
Пример:
#!/bin/bash
sh -c "command"
Какова цель команды sh
когда она используется в интерактивном режиме и внутри скрипта bash?
Другие , чем на хэш взрыва линии (первая линия) должна sh
когда - либо заменить bash
на Баш системе?
Пример:
#!/bin/bash
sh -c "command"
Так много вопросов... Я возьму их по одному за раз.
1) Какова цель команды sh при интерактивном использовании?
Предоставляет новый контекст среды, поэтому, если вы хотите поэкспериментировать с некоторыми настройками переменных среды, вы можете это сделать. И когда вы закончите, exit
, и никакого вреда не будет.
Кроме того, если вы находитесь в другой оболочке, такой как zsh или csh, и хотите выполнить ее в оболочке sh
, это переключит вас.
2) При использовании в bash-скрипте, подобном описанному выше, он снова предоставит контекст контекстной среды для запуска "команды". Вы также можете использовать его с
#!/bin/bash
sh -c "command" &
и разветвите «команду» для запуска параллельно с остальной частью вашего сценария.
3) Я бы сказал, что если это что-то, что конкретно нуждается в bash
, то явно поместите его в строку хэша. Но поскольку в большинстве более поздних * nix-систем sh
эквивалентен bash
, в этом, вероятно, нет необходимости.
sh
?Если вы просто запустите sh
на оболочке, вы запустите другую оболочку внутри текущей оболочки.
sh
в скрипте?То же самое, вы запускаете другую оболочку внутри оболочки, которая обрабатывает скрипт.
/bin/bash
если это то, на что указывает /bin/sh
?Нет Если сценарий предназначен для работы с любой оболочкой, то он предназначен для работы с наименьшим общим знаменателем между всеми оболочками (насколько я понимаю, это является частью стандарта POSIX).
Переход на конкретного переводчика не должен быть вредным (поскольку все они соответствуют одному и тому же стандарту), но это снижает совместимость, но не дает никакой выгоды.
/bin/sh
тогда?Нет. Если вы пишете сценарий самостоятельно, то вы также можете использовать более специфический интерпретатор (например, bash), если этот интерпретатор предоставляет дополнительные функции, которые вы хотите использовать. Но имейте в виду, что каждый, кто использует ваш сценарий, должен иметь выбранного вами переводчика.
Если вы просто хотите запустить новый процесс в своем собственном контексте, тогда, безусловно, используйте /bin/sh
.
Если вы хотите выполнить что-то в своем собственном контексте, вы должны выполнить это в новой оболочке.
Самый простой способ добиться этого - запустить новую оболочку (используя sh
) и передать ей команду.
Пока что- то не является сценарием, специально созданным для определенной оболочки, нет причин вызывать конкретную оболочку. Просто вызовите любую оболочку, используя sh
.
Если у вас есть скрипт, который использует специальный синтаксис, доступный только в bash
, то вы должны установить шебанг соответственно.
sh
- это не команда оболочки, а программа, которую вы вызываете. Ваша строка будет искать sh
на вашем пути. В большинстве случаев он просто выполняет /bin/sh
который находится в пути.
Это начнет новый процесс.
/bin/sh
не гарантированно является bash, сейчас он используется на многих системах bash, но в некоторых системах Unix это оболочка Bourne. Если вы выполните /bin/sh
вы можете ожидать, что оболочка будет придерживаться стандарта POSIX.
Почему /bin /sh ??
Как уже отмечали другие, вы решаете, что это на самом деле означает :) (Или ваш дистрибутив делает для вас.)
По крайней мере, для bash это имеет особое значение ...
Со страницы руководства bash:
«Если bash вызывается с именем sh, он пытается максимально близко имитировать поведение при запуске исторических версий sh, при этом также соответствует стандарту POSIX».
Так что, если вы /bin /sh указывает на /bin /bash, вы получите такое поведение.
#!/ Бен / Баш
дает вам "стандартный" Bash (и его "Bashisms")
конечно /bin /sh на самом деле может быть ссылкой на /bin /dash или ksh или какую-то другую "оболочку".
Страница man bash огромна, но эта конкретная информация всего лишь ... 145 строк :)
Есть несколько хороших введений о: Расширенное руководство по написанию сценариев Bash превосходно.
Если вы используете Debian / Ubuntu (или другие производные):
abs-guide - Расширенное руководство по написанию сценариев
debian-reference-ru -> Руководство по системному администрированию Debian, оригинал на английском языке
например
apt-get install abs-guide
К вашему сведению: (отредактировано до описания)
$ apt-cache show dash
говорит:
Описание-ru: POSIX-совместимая оболочка Оболочка Debian Almquist
(тире) - это POSIX-совместимая оболочка, полученная из золы. ,
Поскольку он выполняет скрипты быстрее, чем bash,
и имеет меньше библиотечных зависимостей
(делая его более устойчивым к программным или аппаратным сбоям),
он используется в качестве системной оболочки по умолчанию в системах Debian.
Домашняя страница:
1) Это оболочка. Его целью в интерактивном режиме является чтение ввода от пользователя и выполнение указанных команд. В неинтерактивном режиме он читает все команды из файла сценария, поэтому он работает без прикосновения к клавиатуре.
2) Разница между «sh -c command» и just "command" в файле сценария заключается в том, что в первом случае команда разветвляется из отдельного процесса оболочки, тогда как во втором случае она разветвляется из процесса, выполняющего основной сценарий оболочки (т.е. имеет доступ к своим файловым дескрипторам, окружению и т. д.). Таким образом, у нас есть дополнительный процесс в дереве процессов в первом случае, а также некоторая степень изоляции.
3) /bin /sh может быть символической ссылкой на /bin /zsh (например), поэтому, да, если вы хотите запустить дочерний скрипт bash из основного скрипта bash, вы должны явно сказать «bash -c». Если дочерний скрипт не зависит от оболочки, то подойдет и sh -c.