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

:~$./myscript

:~$bash ./myscript

:~$bash -c "./myscript"

(предполагая , что это ./myscript exec'able)?

2 ответа2

2

./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

0

Предполагая, что 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

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