В чем разница между бегом:
:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"
(предполагая , что это ./myscript
exec'able)?
./myscript
работает myscript
с любым интерпретатором указан в притоне. myscript
должен быть установлен исполняемый бит.
bash ./myscript
./myscript запускает myscript
вместе с bash. myscript
не должен быть исполняемым, и поскольку bash предоставлен файл для запуска, он даже не ищет его в PATH, поэтому bash myscript
будет работать так же хорошо.
bash -c "./myscript"
запускает экземпляр bash для выполнения команды, которая приводит к его выполнению ./myscript
с любым интерпретатором, указанным в shebang (поэтому он аналогичен первому случаю с добавленным процессом bash), Аргументом bash -c
является любая команда или последовательность команд bash (попробуйте bash -c "echo 'aa';echo 'bb'"
).
И ты не упомянул . ./myscript
Предполагая, что 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