Diferentes formas de ejecutar binarios y scripts

11

He estado usando Linux durante algún tiempo y he estado buscando una descripción completa de esto, pero no encontré ninguna.

Simplemente no llego a un acuerdo con todas las diferentes formas de ejecutar scripts y binarios: todo es un gran desastre para mí y tengo que usar prueba y error para determinar qué debo usar. Para un archivo que es un script o un binario <script/binary>, puedo proponer las siguientes alternativas:

<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>

(¿Hay más?)

¿Alguien puede dar una visión general completa de qué comandos funcionan con qué tipos de archivos y cuál es la diferencia cuando hay varias opciones?

Gracias.

Carl
fuente

Respuestas:

7

Los siguientes comandos son los mismos, un componente de punto significa "directorio actual". Para permitir su ejecución, los archivos deben tener permisos ejecutables:

path/to/binary
./path/to/binary

Tenga en cuenta que si una ruta no contiene una barra oblicua, se trata como un comando (ya sea un shell incorporado o un programa que se busca en la $PATHvariable de entorno).

Los siguientes son casi iguales, ejecutan un script de shell (¡no un binario!) En el entorno de shell actual. En esta pregunta de Unix.SE se describe una pequeña diferencia entre las dos líneas .

. path/to/script
source path/to/script

Finalmente lo mencionaste sh script. Nuevamente, esto solo funciona para scripts de shell y no binarios. Básicamente está ejecutando el shprograma con el nombre del script como argumento. En el caso de sh, solo trata este argumento como un script de shell y lo ejecuta.

Para obtener respuestas restringidas a shellscripts, consulte Diferentes formas de ejecutar un script de shell .

Lekensteyn
fuente
3

Gracias por todo el aporte. Intentaré responder mi propia pregunta ahora y proporcionar una guía completa de las diferentes posibilidades para ejecutar scripts y binarios. Edite y comente y podremos llegar a algo completo y correcto. Aquí está mi sugerencia:

Al principio, dos puntos para indicar:

  • Linux hace una distinción entre un comando y una ruta . Un comando solo se escribe tal cual en el indicador y ejecutará una función incorporada o hará que Linux busque un binario correspondiente o un script en $ PATH.

  • Para que Linux interprete algo como una ruta, debe contener al menos una barra inclinada (/). Por ejemplo ./myScript, en , ./puede parecer bastante redundante: está ahí solo para que Linux lo interprete como una ruta en lugar de un comando.

Entonces, las opciones para ejecutar un binario o un script:

Ejecutando un binario binary:

$ binary          # when 'binary' is on the PATH, or is a built-in
$ ./binary        # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir

Ejecutando un script script:

El archivo deberá tener permisos de ejecución a menos que se indique lo contrario.

$ script        # execute a script that is on PATH. Will be executed in a new shell.
                # The interpreter to use is determined by the she-bang in the file.
$ ./script      # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir. 
                # Otherwise as above.
$ . script      # execute a script in the current dir. Will be executed in the
                # current shell environment.
$ source script # equivalent to the above *1
$ sh script     # executes 'script' in a new shell *2 (the same goes for 'bash ...',
                # 'zsh ...' etc.). Execute permission not neccessary.

Sobre she-bangs :

Los guiones con un she-bang (p #!/bin/sh. Ej. ) En la primera línea le indican qué intérprete usar.

  • Este intérprete se usará cuando se ejecute ./scripto use un comando: script( scriptdebe estar en la RUTA)
  • El uso sh scriptignorará el she-bang y el uso, en este caso, shcomo intérprete
  • Usar . scripto sourceignorará el she-bang y usará el intérprete actual (ya que .o sourcees equivalente a ejecutar cada línea del script en el shell actual)

Notas al pie

* 1: Esto solo es casi cierto. En bash, de hecho, son el mismo comando, pero cuando se usan source, se scriptbuscarán en $ PATH antes del directorio actual. Eso es bash, pero en shells solo POSIX, sourceno funciona, pero .funciona. Por lo tanto, use este último para la portabilidad.

* 2: lo que realmente sucede es que ejecutamos el sh binario con 'script' como argumento, lo que hará que 'sh' ejecute 'script' en su nuevo shell

Carl
fuente
2

Aquí hay una lista rápida de comandos. Tenga en cuenta que cuando menciono PATH, me refiero a los directorios que contienen programas que el sistema conoce; los encuentras echo $PATH, y será algo así como:/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Guiones

  • Para ejecutar un script en el directorio de trabajo actual, use ./myscript.sh
  • Para ejecutar un script en otro archivo, use (si está en el directorio de trabajo actual), ./myscript.sh textfile.txt
  • Las secuencias de comandos también se pueden ejecutar con argumentos; como se explica en Rute (p. 68): se myfile.sh dogs cats birdsgenerará The first argument is: dogs, second argument is: cats, third argument is: birdsporque el contenido de este script después del shebang es:echo "The first argument is: $1, second argument is: $2, third argument is: $3"

  • Para ejecutar un script en otro directorio, use ~/Scripts/dogs.sh

  • Para ejecutar un script que el sistema conoce porque está en su carpeta bin en su directorio de inicio (solo créelo si no está allí, ya que se agregará automáticamente a su RUTA), simplemente use scriptname
  • Para ejecutar un script que haya instalado, nuevamente use su nombre, porque el sistema lo conocerá: por ejemplo, get_iplayer

Binarios

  • Para ejecutar un binario que el sistema conoce porque está en $ PATH, use el nombre del programa y cualquier parámetro, por ejemplo, vlc <stream url to open>
  • Para probar un binario que ha compilado antes de instalarlo en / usr / local / bin, o para mantener un programa independiente alejado del sistema, use ~/<folder>/app/myprog

fuente
Gracias por la información. Esta afirmación es correcta: para ejecutar un script o binario que no esté en PATH, uno simplemente especifica su ruta. La razón ./ es necesaria para un script en la ruta actual es que solo 'script.sh' se interpretaría como un comando, ya que carece de al menos una barra diagonal /.
Carl
"Para ejecutar un script que haya instalado", ¿qué es un script que "he instalado"? ¿Este punto dice lo mismo que el punto anterior?
Carl
@ Carl: tu primer comentario es correcto, pero no es cierto decir que mis dos últimos puntos sobre los guiones son los mismos. En el punto 5 de la sección de script, estaba hablando de los scripts que el usuario ha agregado manualmente a su carpeta bin en su directorio de inicio; en el punto 6 estaba hablando de scripts como get_iplayer que han instalado desde los repositorios y, como tales, siempre van a las carpetas del sistema, no al directorio de inicio del usuario.
Lo siento, pero todavía no entiendo eso, un script en ~ / bin / (que está en PATH) o en una carpeta del sistema (que está en PATH): ¿cómo puede haber una diferencia entre ellos? ¿Se comportan de manera diferente?
Carl
Estaba haciendo una distinción entre los scripts que el usuario posee y agrega a ~ / bin y los que son propiedad de root en las carpetas del sistema.