Tengo una biblioteca: los usuarios deben crear archivos ejecutables, potencialmente con un hashbang para saber exec
qué ejecutable usar. Si omiten el hashbang, entonces creo que la mayoría de los sistemas tienen el valor predeterminado /bin/sh
, quiero cambiar ese valor predeterminado.
Entonces algunos archivos pueden comenzar con:
#!/usr/bin/env foobar
otros archivos pueden comenzar con:
#!/usr/bin/env perl
o
#!/usr/bin/env ruby
Y en algunos casos, el usuario omitirá el hashbang por completo. En ese caso, seguiré ejecutando el archivo directamente y quiero usar el foobar
ejecutable de forma predeterminada.
En otras palabras, No sé cuál será el hashbang de antemano y quiero que sea el predeterminado foobar
en lugar de /bin/sh
, si no hay hashbang presente.
Creo que la forma de hacer lo que estoy haciendo es crear un ejecutable que pueda ejecutarse exec
primero, y si eso falla con un mensaje de error particular, ¿ejecutar el script indirectamente con el foobar
ejecutable?
Algo como esto:
function run {
stdio=$("$1" 2>&1)
if [[ stdout/stderr matches a certain error message ]]; then
foobar $1
fi
}
Mi pregunta es: ¿alguien sabe de qué estoy hablando? ¿Alguien sabe cómo puedo utilizar de forma predeterminada un ejecutable en particular si no hay hashbang presente? ¿No es que en teoría sea menos conveniente verificar si hay un hashbang y, en teoría, es más conveniente simplemente ejecutarlo?
Respuesta1
Puede implementar esto en dos pasos usando execve
: pedirle a la biblioteca C que le pida al kernel que ejecute el objetivo y, si eso falla, intentarlo nuevamente con foobar
. En realidad, así es como los shells comúnmente implementan la ejecución.
Hay otras exec
funciones familiares que ejecutarán scripts sin shebang con /bin/sh
, pero execve
no lo harán.
¿Qué sucede exactamente cuando ejecuto un archivo en mi shell?tiene muchos más detalles sobre este tema.