
В чем разница между бегом:
:~$./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
создает еще один уровень подоболочки — что можно увидеть, проверив SHLVL
var ( bash terminal > running bash -c > running shebang line with bash
3 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