2010-03-18 10 views
15

Tengo un script que tiene este aspectoCuál es la diferencia entre ejecutar una secuencia de comandos shell como ./script.sh y SH script.sh

#!/bin/bash 

function something() { 
echo "hello world!!" 
} 

something | tee logfile 

he puesto el permiso de ejecución de este fichero y cuando intento ejecutar el archivo como esto

$./script.sh 

funciona perfectamente bien, pero cuando lo ejecuto en la línea de comando como este

$sh script.sh 

Se lanza un error. ¿Por qué sucede esto y cuáles son las formas en que puedo solucionarlo?

Respuesta

21

Al ejecutarlo como ./script.sh hará que el núcleo lea la primera línea (el shebang), y luego invocar bash para interpretar el script. Al ejecutarlo como sh script.sh, utiliza el shell que el sistema prefiera sh (en Ubuntu esto es Dash, que es compatible con sh, pero no admite algunas de las funciones adicionales de Bash).

se puede solucionar mediante la invocación como bash script.sh, o si es la máquina que puede cambiar /bin/sh ser bash y no sea lo que es actualmente (por lo general sólo por enlaces simbólicos que - rm /bin/sh && ln -s /bin/bash /bin/sh). O simplemente puede usar ./script.sh en su lugar si eso ya está funcionando;)

Si su caparazón está realmente guionado y desea modificar el guión para que sea compatible, https://wiki.ubuntu.com/DashAsBinSh tiene una guía útil sobre las diferencias. En su muestra, parece que tendría que eliminar la palabra clave de la función.

+1

No es el shell el que lee la primera línea del script sino el núcleo a través de una de las llamadas al sistema exec(). – Beano

+0

Para ser un poco más genérico, el kernel busca un constructo hash-bang en la primera línea del script y ejecuta el intérprete (es decir, el shell) nombrado en esa línea (junto con las opciones que vienen después del intérprete). El OP especificó que el hash-bang era '#!/Bin/bash', por lo que el núcleo comienza * bash *. Del mismo modo, el OP especificó que el archivo era ejecutable, lo cual es necesario para 'path/to/script.sh', pero no para' sh script.sh'. –

0

sh script.sh obliga al script a ejecutarse dentro de sh - shell.

mientras simplemente comenzando desde la línea de comandos utiliza la cáscara-environemnt que se encuentre.

fija por favor el mensaje de error para obtener más respuestas.

Aleatorio sobre cuál puede ser el error: La ruta especificada en la primera línea/bin/bash está mal - ¿quizás bash no está instalado?

+0

Depende del kernel decidir qué hacer con un script ejecutado como './Script.sh'.En casi todas las situaciones, si la primera línea es una línea hash-bang, el kernel iniciará el intérprete nombrado en esa línea con la ruta del script como su próximo argumento (después de cualquier opción suministrada en la línea hash-bang). Puede ejecutar cualquier shell (* zsh *, * dash *, * ksh *, * fish *, * tcsh *, etc.) y 'path/to/script.sh' usará el intérprete especificado en el hash-bang línea. –

1

si la secuencia de comandos se encuentra en su actual directorio de trabajo y usted emite ./script.sh, el núcleo leerá el shebang (primera línea) y ejecutará el intérprete de intérprete de órdenes definido. También puede llamar a su script.sh especificando la ruta del intérprete por ejemplo

/bin/bash myscript.sh 
/bin/sh myscript.sh 
/bin/ksh myscript.sh etc 

Por cierto, también puede poner su tinglado como esto (si no desea especificar la ruta completa)

#!/usr/bin/env sh 
+1

En realidad, el núcleo es quien interpreta el shebang, no el caparazón. – user85509

Cuestiones relacionadas