En Unix, ¿cuál es la diferencia entre un script de shell y un ejecutable?

Respuestas:

12

Un ejecutable se refiere a cualquier archivo con el conjunto de bits ejecutable que podría ejecutarse (incluso si hay errores en la ejecución real del programa).

Un script de shell es un tipo específico de ejecutable que está destinado a ser interpretado por un shell utilizando la #!directiva para especificar un intérprete.

Chris Down
fuente
12

Un script es un archivo que:

  • es legible por humanos (al menos para un humano razonablemente entrenado, es decir, el archivo consta de caracteres imprimibles); y
  • es entendido por un intérprete como instrucciones que describen el comportamiento de un programa.

Un script de shell es un script cuyo intérprete es un shell . En el mundo de Unix, "concha" se refiere a la familia de conchas que se asemejan a la concha de Bourne ; Estos shells modernos (ash, bash, ksh, zsh, ...) se ajustan al estándar de shell POSIX . En términos más generales, la palabra "shell" puede incluir otros intérpretes de comandos como csh, tcsh, fish, ...


Un ejecutable es cualquier archivo que se pueda ejecutar. Para ser efectivamente ejecutable, un archivo debe tener dos propiedades:

  • El usuario debe tener el permiso para ejecutarlo. Esto se puede ver con el comando ls -l: el xpersonaje debe estar presente en la columna de permisos.
  • El formato del archivo debe ser uno que el sistema reconozca como ejecutable. Los formatos ejecutables se pueden dividir en varias categorías:

    • Ejecutables nativos, que consisten en código de máquina organizado de acuerdo con el diseño ejecutable binario del sistema operativo. La mayoría de los sistemas Unix modernos utilizan el formato ELF para sus ejecutables nativos.
    • Guiones. Un script ejecutable es un archivo que comienza con una línea shebang , que consta de los dos caracteres #!seguidos de una ruta a un archivo. Para ejecutar dicho archivo, el núcleo ejecuta el programa de intérprete y le pasa la ruta al script como argumento.
    • Posiblemente otros formatos dependiendo del sistema. Por ejemplo, Linux puede registrar formatos de archivo arbitrarios a través de la instalación binfmt_misc . Esto permite que los archivos de bytecode de Java se ejecuten a través de una JVM registrada , los ejecutables de Windows se ejecuten a través de Wine , etc.

Tenga en cuenta que ser un ejecutable depende del sistema. Por ejemplo, un binario amd64 Linux es ejecutable en un sistema amd64 Linux pero no en un sistema de 32 bits. Un binario para Android no es ejecutable en una instalación normal de Linux. Un ejecutable de Windows solo es ejecutable en Linux si Wine está presente. Un script que comienza #!/usr/local/bin/rubysolo es ejecutable si hay un programa ubicado en /usr/local/bin/ruby.


Un script de shell generalmente es ejecutable. Pero puede ser no ejecutable, si no tiene el permiso para ejecutarlo. Todavía puede hacer que se interprete pasándolo explícitamente al intérprete (por ejemplo bash /path/to/script): "hacer que se interprete" es una forma elegante de decir "ejecutar".

Gilles 'SO- deja de ser malvado'
fuente
2

shell-script:

Un script de shell es una serie de comandos que serán interpretados por un shell (generalmente sh o un shell compatible con sh, a veces otro).

El nombre del script puede, pero NO es necesario, terminar en ".sh" o ".bash" o ".csh", etc. (dando una pista sobre el shell por el que debe ser lanzado).

Para mayor claridad, supondré: que el nombre del script es script, y el shell en el que debe iniciarse es bash.

Una forma típica de lanzarlo en shell sería: bash /absolute/path/to/the/scripto bash ./relative/path/to/the/script. De esa manera, no necesita tener el bit ejecutable establecido, ya que solo se lee por bash, que luego ejecuta el contenido.

También se puede configurar + x (ejecutable) para permitir iniciarlo directamente desde su sesión de shell actual con: / absolute / path / to / the / script (o ./relative/path/to/the/script). Cuidado: de manera predeterminada, cuando se inicia de esa manera, se inicia a través del shell que escribió o mediante un shell posix (el comportamiento depende del sistema operativo), por lo que posiblemente no sea el shell por el que se supone que debe ejecutarse. Es por eso que puede (y debe) especificar como la primera línea del script: #! / Path / to / good / shell, que le indica a su sistema operativo que ese script realmente debería ser lanzado por / path / to / good / shell.

ejecutable:

Un ejecutable es un archivo que tiene el bit "x" establecido para el usuario (s) / grupo (s) por el que se supone que debe ser lanzado. Normalmente puede ser un "binario" o un script.

Consejo: file /some/filepuede darle más información sobre el contenido del archivo. Prueba file /usr/bin/basho file /etc/profilepara ver algunos ejemplos.

Olivier Dulac
fuente
Su declaración sobre scripts shebangless ejecutados por su shell actual es incorrecta. El comportamiento depende del sistema operativo. En general, se utiliza un shell POSIX o su shell de inicio de sesión.
jlliagre
Gracias por esta precisión. Editaré mi respuesta para agregar tu comentario.
Olivier Dulac