¿Qué shell ejecuta scripts cuando no hay una línea shebang (#! / Path / to / shell) al principio? Asumo / bin / sh pero no puedo confirmar.
El núcleo se niega a ejecutar tales secuencias de comandos y devuelve ENOEXEC, por lo que el comportamiento exacto depende del programa que se ejecuta una secuencia de comandos de .
- bash 4.2.39 - se usa a sí mismo
- busybox-ash 1.20.2 - se usa a sí mismo
- guión 0.5.7 - carreras / bin / sh
- pescado 1.23.1 - se queja de ENOEXEC, luego culpa al archivo equivocado
- AT&T ksh 93u + 2012.08.01 - se usa a sí mismo
- mksh R40f - carreras / bin / sh
- pdksh 5.2.14 - carreras / bin / sh
- sh-heirloom 050706 - se usa a sí mismo
- tcsh 6.18.01 - carreras / bin / sh
- zsh 5.0.0 - ejecuta / bin / sh
- cmd.exe 5.1.2600: te mira divertido.
En glibc , funciona execv()
o execve()
simplemente devuelve ENOEXEC. Pero execvp()
oculta este código de error e invoca automáticamente / bin / sh. (Esto está documentado en exec (3p)) .
¿Qué se considera "mejores prácticas" en términos de escribir scripts de shell que se ejecutarán en cualquier plataforma? (ok, esto es algo abierto)
Apéguese a sh
las características definidas por POSIX y solo a ellas, o simplemente vaya a bash completo (que está ampliamente disponible) y menciónelo en sus requisitos si lo distribuye.
(Ahora que lo pienso, Perl, o tal vez Python, sería aún más portátil, sin mencionar que tiene una mejor sintaxis).
Siempre agregue la línea shebang. Si usa bash o zsh, use en #!/usr/bin/env bash
lugar de codificar la ruta del shell. (Sin embargo, se garantiza que el shell POSIX esté en /bin/sh
, así que omita env
en ese caso).
(Desafortunadamente, incluso /bin/sh
no siempre es lo mismo. El programa de autoconfiguración de GNU tiene que lidiar con muchas peculiaridades diferentes ).
¿Es posible escribir un script que intente usar zsh y vuelva a bash si zsh no está disponible? Intenté poner dos líneas shebang, como a continuación, pero solo errores con un mal intérprete: / bin / zsh: no existe tal archivo o directorio si lo intento en una máquina sin zsh.
Solo puede haber una línea shebang; todo después del carácter de nueva línea ni siquiera es leído por el kernel, y tratado por shells.
Es posible escribir un script que se ejecute como #!/bin/sh
, comprueba qué shell está disponible y se ejecuta exec zsh "$0" "$@"
o exec bash "$0" "$@"
depende del resultado. Sin embargo, la sintaxis utilizada por bash y zsh es tan diferente en varios lugares que no recomendaría hacerlo por su propia cordura.