2009-04-09 34 views

Respuesta

846

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.

+54

Gracias por tomarse el tiempo para escribir una buena respuesta a una pregunta simple. –

+4

Si uso 'zsh' como mi shell, ¿usaría' hashbang' '#!/usr/bin/env zsh'? – stefmikhail

+4

@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

71

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 
+0

tnx chicos me ayudaron a aprender un nuevo comando – Dinakar

+0

Gracias, dando permiso ejecutable resuelto mi problema :) – htafoya

11

Para la carcasa bourne:

sh myscript.sh 

Para bash:

bash myscript.sh 
+0

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. –

10

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.

+6

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

0

En primer lugar, dar permiso de ejecución: -
chmod +x script_name

  1. Si la escritura no es ejecutable: -
    Para ejecutar archivo de script sh: -
    sh script_name
    Para ejecutar el archivo script bash: -
    bash script_name
  2. Si el script es ejecutable: -
    ./script_name

NOTA: -se puede comprobar si el archivo es ejecutable o no mediante el uso de 'ls -a'

0

El .command extensión de archivo se asigna a Terminal.app. Al hacer doble clic en cualquier archivo .command, se ejecutará.

Cuestiones relacionadas