
¿Cuál es la diferencia entre correr?
:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"
(suponiendo ./myscript
que sea ejecutable)?
Respuesta1
./myscript
se ejecuta myscript
con cualquier intérprete especificado en el shebang. myscript
necesita tener el bit ejecutable configurado.
bash ./myscript
se ejecuta myscript
con bash. myscript
no necesita ser ejecutable, y dado que bash recibe un archivo para ejecutar, ni siquiera lo busca en la RUTA, por lo que bash myscript
funcionará igual de bien.
bash -c "./myscript"
inicia una instancia de bash para ejecutar un comando, lo que hace que se ejecute ./myscript
con cualquier intérprete especificado en el shebang (por lo que es similar al primer caso, con un proceso bash agregado). El argumento bash -c
es cualquier comando bash o secuencia de comandos (pruebe bash -c "echo 'aa';echo 'bb'"
).
Y no lo has mencionado. ./myscript
Respuesta2
Suponiendo myscript
que es ejecutable y tiene una línea shebang que apunta al bash
binario; no hay diferencia entre ejecutar ./myscript
solo o bash ./myscript
, pero ejecutar bash -c ./myscript
crea un nivel de subcapa más, lo cual puede ver al verificar SHLVL
var ( bash terminal > running bash -c > running shebang line with bash
3 x bash).
Por lo general, estás en una sesión de terminal bash, cuando se ejecuta, ./myscript
la línea shebang llama bash
y crea una bash subshell
en la que se ejecutan los 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
Tome este código a continuación (test.sh) y pruébelo usted mismo.
#!/bin/bash
ps f
echo "SHELL LEVEL: $SHLVL"
echo $BASHPID