node.js shell shebang

Hashbang apropiado para los scripts de Node.js



shell shebang (1)

Estoy intentando crear un script para node.js que funcionará en múltiples entornos. Particularmente para mí, estoy cambiando entre OS X y Ubuntu. En el primero, Node se instala como node , pero en el último es nodejs . En la parte superior de mi guión, puedo tener:

#!/usr/bin/env node

o

#!/usr/bin/env nodejs

Prefiero que el script se ejecute como un ejecutable para cualquiera de los entornos, siempre y cuando el nodo esté instalado, en lugar de que uno u otro tengan que especificar el comando ( ./script-name.js vs. node script-name.js ).

¿Hay alguna manera de especificar un hashbang de copia de seguridad o uno que sea compatible en cualquier caso para node.js?


Si su script está diseñado para que lo utilicen los desarrolladores de Node, debería simplemente usar

#!/usr/bin/env node

y no se moleste en intentar la compatibilidad con personas que solo tienen Node instalado como nodejs .

Razón fundamental:

  • Es lo que hacen los chicos geniales, y si no lo haces también, no lo eres. Los proyectos de nodos principales como jshint , karma , npm e incluso npm simplemente usan #!/usr/bin/env node como el shebang para sus scripts ejecutables.
  • Debido a que los chicos geniales lo están haciendo, cualquiera que trabaje con Node en Ubuntu ha configurado un /usr/bin/node como un enlace simbólico a nodejs . Hay instrucciones muy vistas sobre cómo hacer esto aquí en , y en toda la web. Incluso estaba el paquete nodejs-legacy cuyo propósito principal era crear este enlace simbólico para usted. Las personas que usan Node saben cómo solucionar este problema en Ubuntu, y tienen que hacerlo si quieren usar casi cualquier software escrito en Node.
  • El problema ya no parece existir más en Ubuntu 14.04; Acabo de purgar Node y ejecuté un apt-get install nodejs y creó /usr/bin/node como un enlace simbólico a /etc/alternatives/node . Las personas afectadas por este problema son, sospecho, una minoría en disminución.

Incluso si está apuntando a personas analfabetas del nodo, es posible que desee utilizar #!/usr/bin/env node , tal vez agregando la posible necesidad de creación manual de enlaces simbólicos o la instalación del paquete nodejs-legacy a su documentación de instalación si lo consideren necesario. Tenga en cuenta que si alguien con nodejs pero no node available intenta ejecutar su programa con el shebang anterior, verá:

/ usr / bin / env: node: No existe tal archivo o directorio

y Google que les dará la solución en el primer resultado y muchas veces en la primera página.

Si realmente desea desesperadamente asegurarse de que el usuario puede ejecutar su software en un sistema donde nodejs está disponible pero node no está (o donde node es en realidad el programa Nodo de Radio de Paquetes Aficionados ), entonces puede usar este shebang "tomado de Unix & Linux Stack Exchange :

#!/bin/sh '':'' //; exec "$(command -v nodejs || command -v node)" "$0" "$@" console.log(''Hello world!'');

¿Pero realmente necesitas hacer esto cuando casi nadie más en el mundo Nodo lo es?