Nuestros investigadores estrellas han agotado sus reservas de café, por su búsqueda diariamente por la resolución, hasta que Sergio halló la respuesta en Gogs y ahora la comparte contigo.
Solución:
Cuando ejecuta cualquier secuencia de comandos pasando el nombre de archivo al programa intérprete de secuencias de comandos, está ejecutando el programa intérprete con la secuencia de comandos como un argumento que se le pasa. Por ejemplo, esto se vería como el proceso ‘sh’ con el argumento ‘filename.sh’. Él sh
intérprete está abriendo el archivo.
Por otro lado, si ejecuta el script en sí, el sistema llama al programa intérprete especificado y alimenta el contenido de los scripts. En este caso, el proceso se parece a ‘filename.sh’ sin argumentos.
Debes asegurarte de tener una línea de explosión:
#!/bin/bash
# bash script here
Una línea de explosión es la muy primera linea en el guión y comienza con los mismos dos personajes #!
, esto es lo que lee el sistema cuando intenta ejecutar el script y luego el sistema pasa el script al programa inmediatamente después. Tenga en cuenta que esta línea no tiene nada que ver con bash y funciona igual de bien para python y perl, aunque son lenguajes muy diferentes. usarías #!/usr/bin/python
por ejemplo y luego seguirlo con el código python.
Una vez que tenga su secuencia de comandos, asegúrese de haber configurado los permisos de ejecución:
chmod a+x filename.sh
Luego puede ejecutar el script como su propio proceso:
./filename.sh
O coloque el archivo en una ubicación conocida con un buen nombre de programa, como /usr/sbin
y ejecutar desde cualquier lugar:
sudo cp filename.sh /usr/sbin/program-name
program-name
Y este es realmente el práctico beneficio de usar la línea bang con los permisos correctos: se trata de despliegue. Es muy difícil lograr que los usuarios ejecuten un script si tienen que recordar con qué programa ejecutarlo. Recuerde dar una ruta completa al script cada vez que quiera ejecutarlo. Donde como ponerlo /usr/local/bin
por ejemplo, y hacerlo ejecutable, puede ahorrarle mucho dolor a las personas que intentan usar su script. Estos programas luego estarán disponibles para todos usuarios en su computadora.
También es bueno para la identificación. Si entras en el top
programa, una secuencia de comandos ejecutada sin la línea de explosión solo tendrá el nombre del intérprete, es decir bash
, perl
o python
. Pero si una secuencia de comandos se ejecuta con los permisos adecuados, se muestra el nombre de la secuencia de comandos.
Nota: Si desea distribuir un script que sea accesible para todos, cree una página de manual y un paquete deb para instalarlo. Necesitamos reducir la cantidad de scripts aleatorios en línea y aumentar la cantidad de debs que se pueden desinstalar.
La versión corta:
-
sh
es el intérprete de línea de comandos (guión).
Corriendosh my_script
hace que dash interprete el guión. -
./
intenta averiguar qué intérprete usar, mirando la primera línea. P.ej#!/bin/bash
o incluso#!/bin/ruby
(en lugar de correrruby my_script
).
La diferencia que haces es,
-
con
sh
está ejecutando un programa que interpretará las líneas en su secuencia de comandos tal como las hubiera escrito en el indicador interactivo de la terminal, -
con
./
está haciendo un atajo asumiendo que el script está justo aquí en el directorio actual en el que está sentado Y será ejecutable (porque, por ejemplo, emitióchmod +x myscript.sh
), ahorrándole un tiempo invaluable para el futuro 🙂
Agradecemos que quieras añadir valor a nuestra información dando tu veteranía en las interpretaciones.