Ejecutando modos de script bash

Ejecutando modos de script bash

¿Cuál es la diferencia entre correr?

:~$./myscript

:~$bash ./myscript

:~$bash -c "./myscript"

(suponiendo ./myscriptque sea ejecutable)?

Respuesta1

./myscriptse ejecuta myscriptcon cualquier intérprete especificado en el shebang. myscriptnecesita tener el bit ejecutable configurado.

bash ./myscriptse ejecuta myscriptcon bash. myscriptno necesita ser ejecutable, y dado que bash recibe un archivo para ejecutar, ni siquiera lo busca en la RUTA, por lo que bash myscriptfuncionará igual de bien.

bash -c "./myscript"inicia una instancia de bash para ejecutar un comando, lo que hace que se ejecute ./myscriptcon cualquier intérprete especificado en el shebang (por lo que es similar al primer caso, con un proceso bash agregado). El argumento bash -ces cualquier comando bash o secuencia de comandos (pruebe bash -c "echo 'aa';echo 'bb'").

Y no lo has mencionado. ./myscript

Respuesta2

Suponiendo myscriptque es ejecutable y tiene una línea shebang que apunta al bashbinario; no hay diferencia entre ejecutar ./myscriptsolo o bash ./myscript, pero ejecutar bash -c ./myscriptcrea un nivel de subcapa más, lo cual puede ver al verificar SHLVLvar ( bash terminal > running bash -c > running shebang line with bash3 x bash).

Por lo general, estás en una sesión de terminal bash, cuando se ejecuta, ./myscriptla línea shebang llama bashy crea una bash subshellen 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

información relacionada