Я пытаюсь создать сценарий для node.js, который будет работать в нескольких средах. В частности, я переключаюсь с OS X на Ubuntu и обратно. В первом случае Node устанавливается как node
, а во втором - как nodejs
. В верхней части моего сценария я могу иметь:
#!/usr/bin/env node
или
#!/usr/bin/env nodejs
Я бы предпочел, чтобы сценарий запускался как исполняемый файл для любой среды, пока установлен узел, вместо того, чтобы тот или другой должен был указывать команду ( ./script-name.js
vs. node script-name.js
).
Есть ли способ указать резервный хэшбэнг или тот, который в любом случае совместим с node.js?
#!/usr/bin/node
до ,#!/usr/bin/nodejs
когда я модернизировал от Ubuntu 12.04 до 12.10. И он вызывается из оболочки, которая проверяет и то, и другое. Для обсуждения#!/usr/bin/env
взлома см. Этот вопрос и мой ответ .Ответы:
Если ваш скрипт предназначен для разработчиков Node, вы должны просто использовать
#!/usr/bin/env node
и не пытайтесь обеспечить совместимость с людьми, у которых Node установлен только как
nodejs
.Обоснование:
#!/usr/bin/env node
как притон для своих исполняемых скриптов./usr/bin/node
символическую ссылку наnodejs
. Здесь, в Stack Overflow, и во всем Интернете есть хорошо изученные инструкции по выполнению этого. Был дажеnodejs-legacy
пакет, вся цель которого заключалась в создании для вас этой символической ссылки. Люди, которые используют Node, знают, как решить эту проблему в Ubuntu, и они должны это сделать, если они хотят использовать практически любое программное обеспечение, когда-либо написанное на Node.apt-get install nodejs
и он был создан/usr/bin/node
как символическая ссылка на/etc/alternatives/node
. Я подозреваю, что людей, страдающих от этой проблемы, становится все меньше и меньше.Даже если вы нацелены на неграмотных пользователей Node, вы все равно можете захотеть использовать
#!/usr/bin/env node
, возможно, добавив возможную необходимость создания символических ссылок вручную или установкиnodejs-legacy
пакета в вашу документацию по установке, если вы сочтете это необходимым. Обратите внимание, что если кто-то, у кого есть доступ,nodejs
ноnode
недоступен, попытается запустить вашу программу с указанным выше шебангом, он увидит:и поиск в Google, который даст им исправление в первом результате и много раз на первой странице.
Если вы действительно, отчаянно хотите убедиться, что пользователь может запускать ваше программное обеспечение в системе, где
nodejs
оно доступно, ноnode
не доступно (или гдеnode
на самом деле находится программа узла любительского пакетного радио ), то вы можете использовать этот "двухстрочный шебанг", взятый из Unix и Linux Stack Exchange :#!/bin/sh ':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@" console.log('Hello world!');
но действительно ли вам нужно это делать, когда почти никого в мире узлов нет?
источник
nodejs
исполняемого файла предпочтительнее, вам может показаться немного приятнее использовать shebang с#!/bin/sh
и//bin/false || exec "$(command -v nodejs || command -v node)" "$0"
.--experimental-modules
, если вы используете этуenv
строку shebang. Есть хаки, но они уродливые .