5

Какова цель команды sh когда она используется в интерактивном режиме и внутри скрипта bash?

Другие , чем на хэш взрыва линии (первая линия) должна sh когда - либо заменить bash на Баш системе?

Пример:

#!/bin/bash
sh -c "command"

5 ответов5

12

Так много вопросов... Я возьму их по одному за раз.

1) Какова цель команды sh при интерактивном использовании? Предоставляет новый контекст среды, поэтому, если вы хотите поэкспериментировать с некоторыми настройками переменных среды, вы можете это сделать. И когда вы закончите, exit , и никакого вреда не будет.

Кроме того, если вы находитесь в другой оболочке, такой как zsh или csh, и хотите выполнить ее в оболочке sh , это переключит вас.

2) При использовании в bash-скрипте, подобном описанному выше, он снова предоставит контекст контекстной среды для запуска "команды". Вы также можете использовать его с

#!/bin/bash
sh -c "command" &
и разветвите «команду» для запуска параллельно с остальной частью вашего сценария.

3) Я бы сказал, что если это что-то, что конкретно нуждается в bash , то явно поместите его в строку хэша. Но поскольку в большинстве более поздних * nix-систем sh эквивалентен bash , в этом, вероятно, нет необходимости.

6

Что происходит, когда я выполняю sh?

Если вы просто запустите sh на оболочке, вы запустите другую оболочку внутри текущей оболочки.

Что происходит, когда я использую sh в скрипте?

То же самое, вы запускаете другую оболочку внутри оболочки, которая обрабатывает скрипт.

Должен ли я просто использовать /bin/bash если это то, на что указывает /bin/sh ?

Нет Если сценарий предназначен для работы с любой оболочкой, то он предназначен для работы с наименьшим общим знаменателем между всеми оболочками (насколько я понимаю, это является частью стандарта POSIX).
Переход на конкретного переводчика не должен быть вредным (поскольку все они соответствуют одному и тому же стандарту), но это снижает совместимость, но не дает никакой выгоды.

Итак, я всегда должен использовать /bin/sh тогда?

Как переводчик

Нет. Если вы пишете сценарий самостоятельно, то вы также можете использовать более специфический интерпретатор (например, bash), если этот интерпретатор предоставляет дополнительные функции, которые вы хотите использовать. Но имейте в виду, что каждый, кто использует ваш сценарий, должен иметь выбранного вами переводчика.

Чтобы начать другой процесс

Если вы просто хотите запустить новый процесс в своем собственном контексте, тогда, безусловно, используйте /bin/sh .

Так в чем смысл всего этого?

Если вы хотите выполнить что-то в своем собственном контексте, вы должны выполнить это в новой оболочке.
Самый простой способ добиться этого - запустить новую оболочку (используя sh) и передать ей команду.

Пока что- то не является сценарием, специально созданным для определенной оболочки, нет причин вызывать конкретную оболочку. Просто вызовите любую оболочку, используя sh .

Если у вас есть скрипт, который использует специальный синтаксис, доступный только в bash , то вы должны установить шебанг соответственно.

3

sh - это не команда оболочки, а программа, которую вы вызываете. Ваша строка будет искать sh на вашем пути. В большинстве случаев он просто выполняет /bin/sh который находится в пути.

Это начнет новый процесс.

/bin/sh не гарантированно является bash, сейчас он используется на многих системах bash, но в некоторых системах Unix это оболочка Bourne. Если вы выполните /bin/sh вы можете ожидать, что оболочка будет придерживаться стандарта POSIX.

3

Почему /bin /sh ??

Как уже отмечали другие, вы решаете, что это на самом деле означает :) (Или ваш дистрибутив делает для вас.)

По крайней мере, для bash это имеет особое значение ...

Со страницы руководства bash:

«Если bash вызывается с именем sh, он пытается максимально близко имитировать поведение при запуске исторических версий sh, при этом также соответствует стандарту POSIX».

Так что, если вы /bin /sh указывает на /bin /bash, вы получите такое поведение.

#!/ Бен / Баш

дает вам "стандартный" Bash (и его "Bashisms")

конечно /bin /sh на самом деле может быть ссылкой на /bin /dash или ksh или какую-то другую "оболочку".

Страница man bash огромна, но эта конкретная информация всего лишь ... 145 строк :)

Есть несколько хороших введений о: Расширенное руководство по написанию сценариев Bash превосходно.

http://tldp.org/LDP/abs/html/

Если вы используете Debian / Ubuntu (или другие производные):

abs-guide - Расширенное руководство по написанию сценариев

debian-reference-ru -> Руководство по системному администрированию Debian, оригинал на английском языке

например

apt-get install abs-guide

К вашему сведению: (отредактировано до описания)

$ apt-cache show dash

говорит:

Описание-ru: POSIX-совместимая оболочка Оболочка Debian Almquist

(тире) - это POSIX-совместимая оболочка, полученная из золы. ,

Поскольку он выполняет скрипты быстрее, чем bash,

и имеет меньше библиотечных зависимостей

(делая его более устойчивым к программным или аппаратным сбоям),

он используется в качестве системной оболочки по умолчанию в системах Debian.

Домашняя страница:

http://gondor.apana.org.au/~herbert/dash/

2

1) Это оболочка. Его целью в интерактивном режиме является чтение ввода от пользователя и выполнение указанных команд. В неинтерактивном режиме он читает все команды из файла сценария, поэтому он работает без прикосновения к клавиатуре.

2) Разница между «sh -c command» и just "command" в файле сценария заключается в том, что в первом случае команда разветвляется из отдельного процесса оболочки, тогда как во втором случае она разветвляется из процесса, выполняющего основной сценарий оболочки (т.е. имеет доступ к своим файловым дескрипторам, окружению и т. д.). Таким образом, у нас есть дополнительный процесс в дереве процессов в первом случае, а также некоторая степень изоляции.

3) /bin /sh может быть символической ссылкой на /bin /zsh (например), поэтому, да, если вы хотите запустить дочерний скрипт bash из основного скрипта bash, вы должны явно сказать «bash -c». Если дочерний скрипт не зависит от оболочки, то подойдет и sh -c.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .