linux - run - mac terminal sh
¿Cómo ejecutar un script de shell en una consola Unix o terminal de Mac? (6)
En primer lugar, dar permiso para la ejecución: -
chmod +x script_name
- Si el script no es ejecutable: -
Para ejecutar el archivo de script sh: -
sh script_name
Para ejecutar el archivo de script bash: -
bash script_name
- Si el script es ejecutable:
./script_name
NOTA : -puedes verificar si el archivo es ejecutable o no usando ''ls -a''
Lo sé, olvídalo y vuelve a aprenderlo. Es hora de escribirlo.
La extensión de archivo .command se asigna a Terminal.app. Haciendo doble clic en cualquier archivo .command lo ejecutará.
Para iniciar el shell-script ''file.sh'':
sh file.sh
bash file.sh
Otra opción es establecer el permiso de ejecución usando el comando chmod:
chmod +x file.sh
Ahora ejecute el archivo .sh de la siguiente manera:
./file.sh
Para la cáscara bourne:
sh myscript.sh
Para el bash:
bash myscript.sh
Si desea que la secuencia de comandos se ejecute en el shell actual (por ejemplo, desea que pueda afectar a su directorio o entorno) debe decir:
. /path/to/script.sh
o
source /path/to/script.sh
Tenga en cuenta que /path/to/script.sh
puede ser relativo, por ejemplo . bin/script.sh
. bin/script.sh
ejecuta el script.sh
en el directorio bin
bajo el directorio actual.
Para ejecutar un script sh
no ejecutable, use:
sh myscript
Para ejecutar un script bash
no ejecutable, use:
bash myscript
Para iniciar un ejecutable (que es cualquier archivo con permiso ejecutable); simplemente lo especificas por su ruta:
/foo/bar
/bin/bar
./bar
Para hacer un script ejecutable, dale el permiso necesario:
chmod +x bar
./bar
Cuando un archivo es ejecutable, el núcleo es responsable de descubrir cómo ejecutarlo. Para los no binarios, esto se hace mirando la primera línea del archivo. Debe contener un hashbang
:
#! /usr/bin/env bash
El hashbang le dice al kernel qué programa ejecutar (en este caso, el comando /usr/bin/env
se ejecuta con el argumento bash
). Luego, el script se pasa al programa (como segundo argumento) junto con todos los argumentos que dio al script como argumentos posteriores.
Eso significa que cada script que sea ejecutable debe tener un hashbang . Si no lo hace, no le está diciendo al kernel qué es y, por lo tanto, el kernel no sabe qué programa usar para interpretarlo. Podría ser bash
, perl
, python
, sh
, o algo más. (En realidad, el kernel a menudo usará el shell predeterminado del usuario para interpretar el archivo, lo cual es muy peligroso porque puede que no sea el intérprete adecuado o podría analizarlo, pero con sutiles diferencias de comportamiento, como el caso entre sh
y bash
).
Una nota en /usr/bin/env
Lo más común es que veas explosiones de hash así:
#!/bin/bash
El resultado es que el kernel ejecutará el programa /bin/bash
para interpretar el script. Desafortunadamente, bash
no siempre se envía de forma predeterminada, y no siempre está disponible en /bin
. Mientras que en las máquinas con Linux suele ser así, hay una variedad de otras máquinas POSIX donde bash
envía en varias ubicaciones, como /usr/xpg/bin/bash
o /usr/local/bin/bash
.
Para escribir un script de bash portátil, por lo tanto, no podemos confiar en la codificación del lugar del programa bash
. POSIX ya tiene un mecanismo para lidiar con eso: PATH
. La idea es que instale sus programas en uno de los directorios que están en PATH
y el sistema debería poder encontrar su programa cuando desee ejecutarlo por su nombre.
Lamentablemente, no puedes simplemente hacer esto:
#!bash
El kernel no hará (algunos podrían) hacer una búsqueda de PATH
por ti. Sin embargo, hay un programa que puede hacer una búsqueda de PATH
, se llama env
. Afortunadamente, casi todos los sistemas tienen un programa env
instalado en /usr/bin
. Así que comenzamos env
usando una ruta codificada, que luego realiza una búsqueda PATH
para bash
y la ejecuta para que pueda interpretar su script:
#!/usr/bin/env bash
Este enfoque tiene un inconveniente: según POSIX, el hashbang puede tener un argumento . En este caso, usamos bash
como el argumento del programa env
. Eso significa que no tenemos espacio para pasar argumentos para bash
. Así que no hay manera de convertir algo como #!/bin/bash -exu
a este esquema. Tendrás que poner set -exu
después del hashbang en su lugar.
Este enfoque también tiene otra ventaja: algunos sistemas pueden enviarse con un /bin/bash
, pero al usuario no le gusta, puede encontrar que está defectuoso o desactualizado, y puede haber instalado su propio bash
en otro lugar. Este suele ser el caso en OS X (Mac) donde Apple envía un /bin/bash
obsoleto y los usuarios instalan un /usr/local/bin/bash
actualizado usando algo como Homebrew. Cuando utiliza el enfoque env
que realiza una búsqueda PATH
, tiene en cuenta las preferencias del usuario y utiliza su golpe preferido sobre el sistema con el que se envió.