2

Предполагая, что я сейчас нахожусь в оболочке bash и выполняю следующее

[me@server]$ bash script.sh

q1) Создан ли новый дочерний процесс bash для выполнения скрипта?

Если я сделаю

[me@server]$ ./script.sh

q2) Создан ли новый дочерний процесс bash для выполнения скрипта?

q3) В чем тогда разница между двумя методами?

2 ответа2

0
  1. процесс создания дочернего процесса
  2. так же, как выше (из-за Шебанга)
  3. эти два варианта эквивалентны, если вы не хотите разбирать дочерний элемент или хотите сохранить значение env из script.sh , используйте

    . ./script.sh
    

остерегайтесь однако

  • если script.sh вызовет exit, вы выйдете из текущей оболочки.
  • если оболочка заканчивается без ошибок, вы возвращаетесь к исходной оболочке.
0

Из объяснения косой черты

Разница в том, что

с помощью sh вы запускаете программу, которая будет interpret the lines in your script же, как если бы вы набирали их в интерактивной подсказке терминала,

с ./ вы делаете ярлык, предполагая, что скрипт находится именно здесь, в текущем каталоге, в котором вы сидите, и он будет исполняемым (потому что, например, вы выполнили chmod +x myscript.sh),

Дополнительная информация из этого ответа:

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

Причина разницы в требованиях к разрешениям заключается в том, как загружается программа, которая интерпретирует ваш скрипт:

./script.sh заставляет вашу оболочку запускать файл, как если бы он был обычным исполняемым файлом. Оболочка разветвляется и использует системный вызов (например, execve), чтобы заставить операционную систему выполнить файл в разветвленном процессе. Операционная система проверит права доступа к файлу (следовательно, необходимо установить бит выполнения) и направит запрос загрузчику программы, который просматривает файл и определяет, как его выполнить. В Linux скомпилированные исполняемые файлы начинаются с магического числа ELF, а сценарии начинаются с #! (Hashbang). Заголовок hashbang означает, что файл является скриптом и должен интерпретироваться программой, которая указана после hashbang. Это позволяет самому сценарию сообщать системе, как интерпретировать сценарий.

С вашим скриптом загрузчик программы выполнит /bin /bash и передаст ./script.sh в качестве аргумента командной строки.

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

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