world script menú hello example bash shell

bash - menú - ¿Cómo llamar a shell script desde otro shell script?



menú en shell script de linux (16)

¡Simplemente agregue en una línea lo que hubiera escrito en una terminal para ejecutar el script!
p.ej:

#!bin/bash ./myscript.sh &

Si el script que se va a ejecutar no está en el mismo directorio, solo use la ruta completa del script.
por ejemplo: `/ home / user / script-directory /./ myscript.sh &

Tengo dos scripts de shell, a.sh y b.sh

¿Cómo puedo llamar a b.sh desde el script de shell a.sh ?


Depende de. En pocas palabras ... Si desea cargar las variables en la consola actual y ejecutarlas, puede usar source myshellfile.sh en su código. Ejemplo:

!#/bin/bash set -x echo "This is an example of run another INTO this session." source my_lib_of_variables_and_functions.sh echo "The function internal_function() is defined into my lib." returned_value=internal_function() echo $this_is_an_internal_variable set +x

Si solo desea ejecutar un archivo y lo único que se intersecta para usted es el resultado, puede hacer:

!#/bin/bash set -x ./executing_only.sh sh i_can_execute_this_way_too.sh bash or_this_way.sh set +x

Espero que te ayude. Gracias.


Fuente simple te ayudará. Por ej.

#!/bin/bash echo "My shell_1" source my_script1.sh echo "Back in shell_1"


Hay algunos problemas para importar funciones desde otro archivo.
Primero : no necesitas hacer este archivo ejecutable. Mejor no hacerlo! solo agrega

. file

Para importar todas las funciones. Y todos ellos serán como si estuvieran definidos en su archivo.
Segundo : Puedes definir la función con el mismo nombre. Será sobreescrito. Es malo. Puedes declarar asi

declare -f new_function_name=old_function_name

Y solo después de eso importamos. Así que puedes llamar a la función antigua por un nuevo nombre.
Tercero : puede importar solo la lista completa de funciones definidas en el archivo. Si alguno no lo necesitas puedes desarmarlos. Pero si reescribes tus funciones después de desactivarlas, se perderán. Pero si establece una referencia a él como se describe anteriormente, puede restaurar después de desarmar con el mismo nombre.
Finalmente en procedimiento común de importación es peligroso y no tan simple. ¡Ten cuidado! Puedes escribir un script para hacer esto más fácil y seguro. Si usa solo una parte de las funciones (no todas), divídalos mejor en diferentes archivos. Lamentablemente esta técnica no se hizo bien en bash. En Python, por ejemplo, y en otros lenguajes de script, es fácil y seguro. Posible realizar importación parcial solo funciones necesarias con sus propios nombres. Todos queremos que en las próximas versiones de bush se haga la misma funcionalidad. Pero ahora debemos escribir muchos cod adicionales para hacer lo que quieras.


Hay un par de maneras en que puedes hacer esto. Terminal para ejecutar el script:

#!/bin/bash SCRIPT_PATH="/path/to/script.sh" # Here you execute your script "$SCRIPT_PATH" # or . "$SCRIPT_PATH" # or source "$SCRIPT_PATH" # or bash "$SCRIPT_PATH" # or eval ''"$SCRIPT_PATH"'' # or OUTPUT=$("$SCRIPT_PATH") echo $OUTPUT # or OUTPUT=`"$SCRIPT_PATH"` echo $OUTPUT # or ("$SCRIPT_PATH") # or (exec "$SCRIPT_PATH")

Todo esto es correcto para el camino con espacios !!!


Hay varias formas de hacerlo:

  1. Haga el otro script ejecutable, agregue la línea #!/bin/bash en la parte superior y la ruta donde se encuentra el archivo a la variable de entorno $ PATH. Entonces puedes llamarlo como un comando normal;

  2. O llámelo con el comando source (el alias es . ) Así: source /path/to/script ;

  3. O use el comando bash para ejecutarlo: /bin/bash /path/to/script ;

El primer y tercer método ejecutan el script como otro proceso, por lo que las variables y funciones en el otro script no serán accesibles.
El segundo método ejecuta la secuencia de comandos en el proceso de la primera secuencia de comandos, y extrae variables y funciones de la otra secuencia de comandos para que sean utilizables desde la secuencia de comandos de llamada.

En el segundo método, si está utilizando exit en el segundo script, también saldrá del primer script. Lo que no sucederá en primer y tercer método.


La respuesta principal sugiere agregar la línea #!/bin/bash a la primera línea del sub-script que se está llamando. Pero incluso si agregas el shebang, es mucho más rápido * ejecutar un script en un sub-shell y capturar la salida:

$(source SCRIPT_NAME)

Esto funciona cuando desea seguir ejecutando el mismo intérprete (por ejemplo, desde bash a otro script de bash) y garantiza que la línea shebang del sub-script no se ejecute.

Por ejemplo:

#!/bin/bash SUB_SCRIPT=$(mktemp) echo "#!/bin/bash" > $SUB_SCRIPT echo ''echo $1'' >> $SUB_SCRIPT chmod +x $SUB_SCRIPT if [[ $1 == "--source" ]]; then for X in $(seq 100); do MODE=$(source $SUB_SCRIPT "source on") done else for X in $(seq 100); do MODE=$($SUB_SCRIPT "source off") done fi echo $MODE rm $SUB_SCRIPT

Salida:

~ ❯❯❯ time ./test.sh source off ./test.sh 0.15s user 0.16s system 87% cpu 0.360 total ~ ❯❯❯ time ./test.sh --source source on ./test.sh --source 0.05s user 0.06s system 95% cpu 0.114 total

* Por ejemplo, cuando se ejecutan virus o herramientas de seguridad en un dispositivo, se pueden requerir 100 ms adicionales para ejecutar un nuevo proceso.


La respuesta que buscaba:

( exec "path/to/script" )

Como se mencionó, exec reemplaza el shell sin crear un nuevo proceso. Sin embargo , podemos ponerlo en una subshell, lo cual se hace usando los paréntesis.

EDITAR: En realidad ( "path/to/script" ) es suficiente.


Mira esto.

#!/bin/bash echo "This script is about to run another script." sh ./script.sh echo "This script has just run another script."


Primero debes incluir el archivo al que llamas:

#!/bin/bash . includes/included_file.sh

entonces llamas a tu función así:

#!/bin/bash my_called_function


Puede usar /bin/sh para llamar o ejecutar otro script (a través de su script real):

# cat showdate.sh #!/bin/bash echo "Date is: `date`" # cat mainscript.sh #!/bin/bash echo "You are login as: `whoami`" echo "`/bin/sh ./showdate.sh`" # exact path for the script file

La salida sería:

# ./mainscript.sh You are login as: root Date is: Thu Oct 17 02:56:36 EDT 2013


Supongamos que el nuevo archivo es "/ home / satya / app / app_specific_env" y el contenido del archivo es el siguiente

#!bin/bash export FAV_NUMBER="2211"

Agregue esta referencia de archivo al archivo ~ / .bashrc

source /home/satya/app/app_specific_env

Cuando reinicie la máquina o vuelva a iniciar sesión, intente echo $FAV_NUMBER en el terminal. Saldrá el valor.

En caso de que desee ver el efecto de inmediato, source ~/.bashrc en la línea de comandos.


Utilice backticks.

$ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`

Luego, obtenga la salida del script del productor como un argumento en el script del consumidor.


#!/bin/bash # Here you define the absolute path of your script scriptPath="/home/user/pathScript/" # Name of your script scriptName="myscript.sh" # Here you execute your script $scriptPath/$scriptName # Result of script execution result=$?


chmod a+x /path/to/file-to-be-executed

Eso era lo único que necesitaba. Una vez que el script que se va a ejecutar se hace ejecutable de esta manera, usted (al menos en mi caso) no necesita ninguna otra operación adicional como sh o ./ mientras está llamando al script.

Gracias al comentario de @Nathan Lilienthal.


pathToShell="/home/praveen/" chmod a+x $pathToShell"myShell.sh" sh $pathToShell"myShell.sh"