Cambie el ejecutable predeterminado para el archivo con shebang potencialmente faltante

Cambie el ejecutable predeterminado para el archivo con shebang potencialmente faltante

Tengo una biblioteca: los usuarios deben crear archivos ejecutables, potencialmente con un hashbang para saber execqué 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 foobarejecutable de forma predeterminada.

En otras palabras, No sé cuál será el hashbang de antemano y quiero que sea el predeterminado foobaren 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 execprimero, y si eso falla con un mensaje de error particular, ¿ejecutar el script indirectamente con el foobarejecutable?

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 execfunciones familiares que ejecutarán scripts sin shebang con /bin/sh, pero execveno lo harán.

¿Qué sucede exactamente cuando ejecuto un archivo en mi shell?tiene muchos más detalles sobre este tema.

información relacionada