Saltar al contenido

¿Universal Node.js shebang?

Hemos estado buscado por diferentes foros y así darte la solución a tu problema, si tienes alguna duda déjanos tu pregunta y te respondemos con gusto, porque estamos para servirte.

Solución:

Lo mejor que se me ocurrió es este “shebang de dos líneas” que realmente es un script políglota (Bourne shell / Node.js):

#!/bin/sh
':' //; exec "$(command -v nodejs || command -v node)" "$0" "[email protected]"

console.log('Hello world!');

La primera línea es, obviamente, un tinglado de concha de Bourne. Node.js pasa por alto cualquier shebang que encuentre, por lo que este es un archivo javascript válido en lo que respecta a Node.js.

La segunda línea llama al shell no-op : con el argumento // y luego ejecuta nodejs o node con el nombre de este archivo como parámetro. command -v se utiliza en lugar de which para la portabilidad. La sintaxis de sustitución de comandos $(...) no es estrictamente Bourne, así que opte por acentos graves si ejecuta esto en la década de 1980.

Node.js solo evalúa el string ':'que es como un no-op, y el resto de la línea se analiza como un comentario.

El resto del archivo es simplemente javascript antiguo. La subcapa se cierra después de la exec en la segunda línea se completa, por lo que el shell nunca lee el resto del archivo.

¡Gracias a xavierm02 por la inspiración y a todos los comentaristas por la información adicional!

Esto es solo un problema en los sistemas basados ​​en Debian, donde la política superó el sentido.

No sé cuándo proporcionó Fedora un binario llamado nodejs, pero nunca lo vi. El paquete se llama nodejs e instala un binario llamado node.

Simplemente use un enlace simbólico para aplicar el sentido común a sus sistemas basados ​​en Debian, y luego puede usar un tinglado sensato. De todos modos, otras personas usarán shebangs cuerdos, por lo que necesitará ese enlace simbólico.

#!/usr/bin/env node

console.log("Spread the love.");

#!/bin/sh
//bin/false || `which node || which nodejs` << `tail -n +2 $0`
console.log('ok');

//bin/false es lo mismo que /bin/false excepto que la segunda barra lo transforma en un comentario para el nodo, y por eso está aquí. Luego, el lado derecho de la primera || se evalúa. 'which node || which nodejs' con comillas inversas en lugar de comillas inicia el nodo y el << lo alimenta lo que sea que esté a la derecha. Podría haber usado un delimitador que comenzara con // como lo hizo dancek, habría funcionado pero me parece más limpio tener solo dos líneas al principio, así que usé tail -n +2 $0 para que el archivo se lea solo excepto las dos primeras líneas.

Y si lo ejecuta en el nodo, la primera línea se reconoce como un shebang y se ignora, y la segunda es un comentario de una línea.

(Aparentemente, sed podría usarse para reemplazar el contenido del archivo de impresión de cola sin la primera y la última línea)


Responder antes de editar:

#!/bin/sh
`which node || which nodejs` <<__HERE__
console.log('ok');
__HERE__

No puede hacer lo que quiere, así que lo que hace es ejecutar un script de shell, por lo tanto, el #!/bin/sh. Ese script de shell obtendrá la ruta del archivo necesario para ejecutar el nodo, es decir which node || which nodejs. Las comillas inversas están aquí para que se ejecute, por lo que 'which node || which nodejs' (con las comillas inversas en lugar de las comillas) simplemente llama a node. Luego, simplemente alimenta su script con <<. los __HERE__ son los delimitadores de su script. Y el console.log('ok'); es un ejemplo de secuencia de comandos que debe reemplazar con su secuencia de comandos.

Comentarios y valoraciones de la guía

Acuérdate de que puedes optar por la opción de glosar tu experiencia si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *