Запуск режимов скрипта bash

Запуск режимов скрипта bash

В чем разница между бегом:

:~$./myscript

:~$bash ./myscript

:~$bash -c "./myscript"

(предполагается, ./myscriptчто он исполняемый)?

решение1

./myscriptзапускается myscriptс любым интерпретатором, указанным в shebang. myscriptнеобходимо установить исполняемый бит.

bash ./myscriptзапускается myscriptс помощью bash. myscriptне обязательно должен быть исполняемым, и поскольку bash получает файл для запуска, он даже не ищет его в PATH, поэтому bash myscriptбудет работать так же хорошо.

bash -c "./myscript"запускает экземпляр bash для выполнения команды, которая, как оказалось, заставляет ее выполняться ./myscriptс любым интерпретатором, указанным в shebang (так что это похоже на первый случай с добавленным процессом bash). Аргументом bash -cявляется любая команда bash или последовательность команд (try bash -c "echo 'aa';echo 'bb'").

И вы не упомянули. ./myscript

решение2

Предположим, myscriptчто является исполняемым файлом и имеет строку shebang, указывающую на bashдвоичный файл — нет никакой разницы между запуском ./myscriptотдельно или bash ./myscript, но запуск bash -c ./myscriptсоздает еще один уровень подоболочки — что можно увидеть, проверив SHLVLvar ( bash terminal > running bash -c > running shebang line with bash3 x bash)

Обычно вы находитесь в терминальном сеансе bash, когда при выполнении ./myscriptстроки shebang вызывается bashи создается файл bash subshell, в котором выполняются команды.

30311 pts/0    Ss     0:00 -bash
 8419 pts/0    S+     0:00  \_ /bin/bash ./test.sh
 8420 pts/0    R+     0:00      \_ ps f
SHELL LEVEL: 2  # is 3 when running with bash -c
8419  # that's the $BASHPID

Возьмите приведенный ниже код (test.sh) и попробуйте сами.

#!/bin/bash

ps f
echo "SHELL LEVEL: $SHLVL"
echo $BASHPID

Связанный контент