Executando modos de script bash

Executando modos de script bash

Qual é a diferença entre correr:

:~$./myscript

:~$bash ./myscript

:~$bash -c "./myscript"

(supondo que ./myscriptseja executável)?

Responder1

./myscripté executado myscriptcom qualquer intérprete especificado no shebang. myscriptprecisa ter o bit executável definido.

bash ./myscriptcorre myscriptcom bash. myscriptnão precisa ser executável e, como o bash recebe um arquivo para ser executado, ele nem mesmo o procura no PATH, portanto bash myscriptfuncionará da mesma forma.

bash -c "./myscript"inicia uma instância bash para executar um comando, o que faz com que ele seja executado ./myscriptcom 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 myscriptque seja executável e tenha uma linha shebang apontando para o bashbinário - não há diferença entre executar ./myscriptsozinho ou bash ./myscript, mas executar bash -c ./myscripté criar mais um nível de subshell - o que você pode ver verificando o SHLVLvar( bash terminal > running bash -c > running shebang line with bash3 x bash)

Normalmente você está em uma sessão de terminal bash, ao executar ./myscripta linha shebang está chamando bashe criando um bash subshellno 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

informação relacionada