
Qual é a diferença entre correr:
:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"
(supondo que ./myscript
seja executável)?
Responder1
./myscript
é executado myscript
com qualquer intérprete especificado no shebang. myscript
precisa ter o bit executável definido.
bash ./myscript
corre myscript
com bash. myscript
não precisa ser executável e, como o bash recebe um arquivo para ser executado, ele nem mesmo o procura no PATH, portanto bash myscript
funcionará da mesma forma.
bash -c "./myscript"
inicia uma instância bash para executar um comando, o que faz com que ele seja executado ./myscript
com qualquer interpretador especificado no shebang (portanto, é semelhante ao primeiro caso, com um processo bash adicionado). O argumento para bash -c
é qualquer comando bash ou sequência de comandos (try bash -c "echo 'aa';echo 'bb'"
).
E você não mencionou. ./myscript
Responder2
Supondo myscript
que seja executável e tenha uma linha shebang apontando para o bash
binário - não há diferença entre executar ./myscript
sozinho ou bash ./myscript
, mas executar bash -c ./myscript
é criar mais um nível de subshell - o que você pode ver verificando o SHLVL
var( bash terminal > running bash -c > running shebang line with bash
3 x bash)
Normalmente você está em uma sessão de terminal bash, ao executar ./myscript
a linha shebang está chamando bash
e criando um bash subshell
no qual está executando os comandos.
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
Pegue este código abaixo (test.sh) e experimente você mesmo.
#!/bin/bash
ps f
echo "SHELL LEVEL: $SHLVL"
echo $BASHPID