¿Por qué necesito poner sh antes de ejecutar archivos .sh?

16

Cuando quiero ejecutar .sh archivos en la Terminal, necesito poner sh frente a ellos.

¿Hay alguna manera de evitar esto, y así guardar la escritura?

    
pregunta More Than Five 07.09.2013 - 17:29

2 respuestas

22

Si está ejecutando su script desde el shell, en realidad no necesita el #!/bin/sh shebang como se describe en este esta respuesta : todos los sistemas similares a Unix que he usado, incluido OS X, predeterminarán /bin/sh si no se especifica específicamente un intérprete (aunque es una buena idea, ya que los no shells no sabrán cómo ejecuta tu script a menos que le des el shebang.)

Tampoco necesitas una extensión .sh . Usted do necesita establecer permisos de ejecución, por ejemplo

$ chmod +x script.sh

( $ es el indicador de la shell; lo estoy usando para ilustrar los comandos que le das a la shell interactiva. ¡No la escribas!)

Sin embargo, creo que lo que te confunde es que has creado un script, por ejemplo. script.sh , en el directorio actual, y están intentando ejecutarlo simplemente escribiendo script.sh . por ejemplo

$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found

( ^D significa control - D . Encontrará esta notación en muchos informes sobre el uso de Unix.)

El hecho de que script.sh en este caso sea un script de shell es solo la mitad del problema; su problema real es que, de forma predeterminada, el shell no buscará un programa en el directorio actual. Sin embargo, esto funciona:

$ sh script.sh
hello, world

porque sh está tomando el script como argumento.

Puede ejecutar un script (o, nuevamente, cualquier ejecutable) en el directorio actual, si está marcado como ejecutable (es decir, chmod +x ), especificando que desea ejecutar el que está en el directorio actual:

$ ./script.sh
hello, world

También puede mover el script a un directorio en su PATH . Recomiendo /usr/local/bin para esto si su script está destinado a ser utilizado en todo el sistema, o un directorio bin en su casa si el script es solo para usted. Este último requiere que agregue $HOME/bin , que se expande a su nuevo directorio bin, a su PATH agregando las siguientes líneas a su .profile en su directorio principal:

PATH=$HOME/bin:$PATH
export PATH

Finalmente, si lo desea, puede agregar el directorio actual a su PATH , lo que le permitirá ir a un directorio que contenga script.sh –o cualquier otro ejecutable– y escribir

$ script.sh

para ejecutarlo. Sin embargo, no recomiendo esta práctica , ya que un atacante ahora puede engañarlo para que ejecute un ejecutable arbitrario colocando un script ejecutable (llamado, por ejemplo, ls ) en un directorio en el que estará. Sin embargo, si realmente quiere hacerlo, simplemente agregue lo siguiente a su .profile :

PATH=.:$PATH
export PATH
    
respondido por el zigg 07.09.2013 - 19:36
10

No es necesario llamar a sh si el archivo de script está marcado como ejecutable. En ese caso, puedes llamarlo mi nombre como lo harías con cualquier otro comando del shell existente.

Para ser completamente correcto, querrás hacer dos cosas:

  1. Edite su script para incluir una directiva shebang en la parte superior de su script:

    #!/bin/sh

    ... Eso le diría al shell qué intérprete usar para ejecutar el script; en este caso, el /bin/sh ejecutable.

  2. Marque el script como ejecutable con el comando chmod :

    chmod u+x scriptname.sh

Una vez que hayas hecho ambos, deberías poder ejecutar tu script escribiendo el nombre de archivo de tu script en la línea de comandos. Deberá estar en el mismo directorio que su script, a menos que también realice el paso adicional de agregar la carpeta que contiene a su Variable PATH . Si no le importa qué shell ejecute el script, no necesita el paso uno para especificar sh , pero a menudo es mejor ser preciso y establecer el "shebangsh".

    
respondido por el Chris W. Rea 07.09.2013 - 17:34

Lea otras preguntas en las etiquetas