Lo sé, olvídalo y vuelve a aprenderlo. Es hora de escribirlo.
Lo sé, olvídalo y vuelve a aprenderlo. Es hora de escribirlo.
Respuestas:
Para ejecutar un sh
script no ejecutable , use:
sh myscript
Para ejecutar un bash
script no ejecutable , use:
bash myscript
Para iniciar un ejecutable (que es cualquier archivo con permiso ejecutable); simplemente lo especifica por su ruta:
/foo/bar
/bin/bar
./bar
Para hacer un script ejecutable, dele 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 núcleo 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 le dio al script como argumentos posteriores.
Eso significa que cada script ejecutable debe tener un hashbang . Si no lo hace, no le está diciendo al núcleo qué es , y por lo tanto, el núcleo no sabe qué programa usar para interpretarlo. Podría ser bash
, perl
, python
, sh
, o alguna otra cosa. (En realidad, el kernel a menudo usará el shell predeterminado del usuario para interpretar el archivo, lo cual es muy peligroso porque podría no ser el intérprete correcto o podría analizarlo, pero con diferencias de comportamiento sutiles como es el caso). el caso entre sh
y bash
).
/usr/bin/env
Lo más común es que veas hash bangs así:
#!/bin/bash
El resultado es que el núcleo ejecutará el programa /bin/bash
para interpretar el script. Desafortunadamente, bash
no siempre se envía de manera predeterminada y no siempre está disponible en /bin
. Mientras que en las máquinas Linux suele ser así, hay una gama de otras máquinas POSIX donde se bash
envía en varias ubicaciones, como /usr/xpg/bin/bash
o /usr/local/bin/bash
.
Para escribir un script bash portátil, por lo tanto, no podemos confiar en codificar la ubicación del bash
programa. POSIX ya cuenta con un mecanismo para tratar lo siguiente: PATH
. La idea es que instale sus programas en uno de los directorios que se encuentran PATH
y el sistema debería poder encontrar su programa cuando quiera ejecutarlo por su nombre.
Lamentablemente, no puedes simplemente hacer esto:
#!bash
El núcleo no (algunos podrían) PATH
buscarlo por usted. Sin PATH
embargo, hay un programa que puede buscarlo, se llama env
. Afortunadamente, casi todos los sistemas tienen env
instalado un programa /usr/bin
. Entonces, comenzamos a env
usar una ruta codificada, que luego realiza una PATH
búsqueda bash
y la ejecuta para que pueda interpretar su script:
#!/usr/bin/env bash
Este enfoque tiene una desventaja: según POSIX, el hashbang puede tener un argumento . En este caso, lo usamos bash
como argumento para el env
programa. Eso significa que no nos queda espacio para pasar argumentos bash
. Por lo tanto, no hay forma de convertir algo parecido #!/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 puede no gustarle, encontrarlo defectuoso u obsoleto, y puede haber instalado el suyo bash
en otro lugar. Este suele ser el caso en OS X (Mac) donde Apple envía una /bin/bash
versión obsoleta y los usuarios instalan una versión actualizada /usr/local/bin/bash
utilizando algo como Homebrew. Cuando utiliza el env
enfoque que realiza una PATH
búsqueda, tiene en cuenta las preferencias del usuario y utiliza su bash preferido sobre el que envió su sistema.
zsh
como mi shell, ¿usaría el hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
si (y solo si) el código dentro del script debe ser ejecutado por el shell Z.
Para iniciar el script de shell 'file.sh':
sh file.sh
bash file.sh
Otra opción es establecer permisos de ejecución utilizando el comando chmod:
chmod +x file.sh
Ahora ejecute el archivo .sh de la siguiente manera:
./file.sh
Para la cáscara de bourne:
sh myscript.sh
Para bash:
bash myscript.sh
Si desea que el script se ejecute en el shell actual (p. Ej., Desea que pueda afectar 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
ejecuta script.sh
el bin
directorio en el directorio actual.
Primero, autorice la ejecución: -
chmod +x script_name
sh script_name
bash script_name
./script_name
NOTA : puede verificar si el archivo es ejecutable o no usando 'ls -a'
Pequeña adición, para ejecutar un intérprete desde la misma carpeta, todavía usando #! Hashbang en los scripts.
Como ejemplo, un ejecutable php7.2 copiado de / usr / bin está en una carpeta junto con un script de saludo .
#!./php7.2
<?php
echo "Hello!";
Para ejecutarlo:
./hello
Que se comportan igual de igual que:
./php7.2 hello