Executando modos de script bash

0

Qual é a diferença entre a execução:

:~$./myscript

:~$bash ./myscript

:~$bash -c "./myscript"

(assumindo que ./myscript é executável)?

    
por Mulligan 28.05.2017 / 12:01

2 respostas

2

./myscript runs myscript com qualquer intérprete especificado no shebang. myscript precisa ter o bit executável definido.

bash ./myscript corre myscript com o bash. myscript não precisa ser executável, e como o bash recebe um arquivo para ser executado, ele nem está procurando por ele no PATH, então bash myscript funcionará tão bem.

bash -c "./myscript" inicia uma instância do bash para executar um comando, o que acontece para fazê-lo executar ./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 (tente bash -c "echo 'aa';echo 'bb'" ).

E você não mencionou . ./myscript

    
por 28.05.2017 / 13:26
0

Assumindo que myscript é executável e está tendo 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 está criando mais um subnível - 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, quando executar ./myscript a linha shebang está chamando bash e criando um bash subshell no qual ele 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 tente você mesmo.

#!/bin/bash

ps f
echo "SHELL LEVEL: $SHLVL"
echo $BASHPID
    
por 28.05.2017 / 13:34

Tags