Lo sé, olvídalo y vuelve a aprenderlo. Es hora de escribirlo.¿Cómo ejecutar un script de shell en una consola Unix o en un terminal Mac?
Respuesta
para ejecutar un no ejecutable sh
secuencia de comandos, utilice:
sh myscript
para ejecutar un no ejecutable bash
escritura, uso:
bash myscript
Para iniciar un ejecutable (que es cualquier archivo con permiso ejecutable); que acaba de especificar que por su ruta:
/foo/bar
/bin/bar
./bar
Para hacer un script ejecutable, le dan el permiso necesario:
chmod +x bar
./bar
Cuando un archivo es ejecutable, el kernel es responsable de encontrar la manera de para exectelo. 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 se ejecute (en este caso el comando /usr/bin/env
se corrió con el argumento bash
). Luego, la secuencia de comandos se pasa al programa (como segundo argumento) junto con todos los argumentos que le dio a la secuencia de comandos como argumentos posteriores.
Eso significa cada script que es ejecutable debe tener un hashbang. Si no lo hace, no le está diciendo al núcleo que 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 usará a menudo el intérprete de comandos predeterminado del usuario para interpretar el archivo, lo cual es muy peligroso porque podría no ser el intérprete correcto o podría ser capaz de analizar parte de él, pero con sutiles diferencias de comportamiento, como el caso entre sh
y bash
).
Una nota sobre /usr/bin/env
Más comúnmente, verá explosiones de hash de este modo:
#!/bin/bash
El resultado es que el núcleo se ejecutará el programa /bin/bash
para interpretar la secuencia de comandos. Desafortunadamente, bash
no siempre se envía por defecto, y no siempre está disponible en /bin
. Mientras que en las máquinas Linux usualmente lo es, hay una gama de otras máquinas POSIX donde bash
se envía en varias ubicaciones, como /usr/xpg/bin/bash
o /usr/local/bin/bash
.
Para escribir una secuencia de comandos bash portátil, no podemos por lo tanto confiar en la codificación de la ubicación del programa bash
. POSIX ya tiene un mecanismo para tratar 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, usted no puede acaba de hacer esto:
#!bash
El kernel no (algunos pueden) hacer una búsqueda PATH
para usted. 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 empezar env
utilizando una ruta codificada, que luego se hace una búsqueda PATH
para bash
y lo ejecuta de manera que pueda interpretar la secuencia de comandos:
#!/usr/bin/env bash
Este enfoque ha un inconveniente: De acuerdo con POSIX, la Hashbang puede tener un argumento. En este caso, usamos bash
como argumento para el programa env
. Eso significa que no tenemos espacio para pasar argumentos al bash
. Por lo tanto, no hay forma de convertir algo como #!/bin/bash -exu
en 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 enviar con un /bin/bash
, pero el usuario no les guste, pueden encontrar su buggy o anticuado, y pueden haber instalado su propia bash
en otro lugar. Este es a menudo 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 método env
que hace una búsqueda PATH
, toma en cuenta la preferencia del usuario y usa su elección preferida sobre la que le envió su sistema.
Gracias por tomarse el tiempo para escribir una buena respuesta a una pregunta simple. –
Si uso 'zsh' como mi shell, ¿usaría' hashbang' '#!/usr/bin/env zsh'? – stefmikhail
@stefmikhail: No importa qué intérprete de intérprete de comandos utiliza para * invocar * la secuencia de comandos, debe usar '#!/usr/bin/env zsh' si (y solo si) el código * dentro * del script debe ser ejecutado por el shell Z. – Johnsyweb
Para iniciar el shell-script 'file.sh':
sh file.sh
bash file.sh
Otra opción se establece permiso de ejecución con el comando chmod:
chmod +x file.sh
Ahora ejecute el archivo .sh de la siguiente manera:
./file.sh
Para la carcasa bourne:
sh myscript.sh
Para bash:
bash myscript.sh
Gracias por responder a esta pregunta bastante obvia. Para un tipo Mac como yo es fácil olvidar los viejos comandos de Unix entre las vueltas. –
si desea que la secuencia de comandos para ejecutar en el shell actual (por ejemplo, usted quiere que sea capaz de afectar a su directorio o el medio ambiente), debe decir:
. /path/to/script.sh
o
source /path/to/script.sh
Nota que /path/to/script.sh
puede ser relativo, por ejemplo . bin/script.sh
ejecuta script.sh
en el directorio bin
bajo el directorio actual.
Sea ** muy ** cuidadoso al aprovisionar o puntear con nombres de ruta relacionados. Deberías ** siempre ** iniciarlos con ./ Si no lo haces, y la ruta de acceso relativa no contiene barras, obtendrás algo en PATH, ANTES de algo en el directorio actual. Muy peligroso para el abuso. – lhunath
En primer lugar, dar permiso de ejecución: -
chmod +x script_name
- Si la escritura no es ejecutable: -
Para ejecutar archivo de script sh: -
sh script_name
Para ejecutar el archivo script bash: -
bash script_name
- Si el script es ejecutable: -
./script_name
NOTA: -se puede comprobar si el archivo es ejecutable o no mediante el uso de 'ls -a'
El .command extensión de archivo se asigna a Terminal.app. Al hacer doble clic en cualquier archivo .command, se ejecutará.
- 1. ¿Cómo compilar y ejecutar C/C++ en una consola Unix/terminal de Mac?
- 2. Cómo ejecutar un script de shell de Unix desde Windows
- 3. ¿Cómo ejecutar un script de shell Unix desde código Java?
- 4. ¿Cómo obtengo un archivo Mac ".command" para cerrar automáticamente después de ejecutar un script de shell?
- 5. ¿Cómo ejecutar un script de Ruby en la Terminal?
- 6. ¿Cómo ejecutar un script de shell utilizando Spotlight?
- 7. ¿Cómo ejecutar un script como root en Mac OS X?
- 8. ¿Valores predeterminados en un script de shell de Unix?
- 9. ¿Cómo hacer el procesamiento paralelo en el script Unix Shell?
- 10. Activar una aplicación o script en un comando shell
- 11. Cómo ejecutar un comando de shell desde un script php
- 12. ¿Cómo ejecutar un script de shell desde C en Linux?
- 13. ¿Cómo hacer un script de shell global?
- 14. ¿Cómo ejecuto un script bash en Terminal?
- 15. Crear un shell UNIX
- 16. comando MAC para ejecutar un archivo .pkg en el terminal
- 17. ¿Cómo ejecutar un script de shell interactivo usando java Runtime?
- 18. ¿Cómo ejecutar comandos de shell desde una aplicación Mac/MacRuby?
- 19. Ejecutar script en mac "Permiso denegado"
- 20. ¿Volver a cargar .profile en script bash shell (en Unix)?
- 21. cd ¿Terminal en un directorio determinado después de ejecutar un script de Python?
- 22. Cómo ejecutar un script de shell en segundo plano y no obtener resultados
- 23. Qt Creator: Ejecutar en un terminal
- 24. Ejecutar un script de shell con un botón html
- 25. ¿Cómo ejecuto un editor desde un script de shell?
- 26. ¿Cómo creo una consola C++/proyecto de terminal en XCode?
- 27. Seleccionar valores únicos o distintos de una lista en el script de shell de UNIX
- 28. Emacs: Ejecutar código en modo shell-script
- 29. Cómo almacenar una salida de script de shell a una variable en Unix?
- 30. Cómo ejecuto un script de shell PHP como acción de Automator en Mac OS X
escribiendo el tren de votos hasta llegar a la estación de reputación – DivideByZer0
¡No voy a votar solo para admirar ese error increíble que tienes allí! – BRHSM