Что именно делает"/usr/bin / env node " в начале файлов узлов?


Я видел эту строку #!/usr/bin/env node в начале некоторых примеров в nodejs и я погуглил, не найдя ни одной темы, которая могла бы ответить на причину этой строки.

природа слов делает поиск не так просто.

Я бы почитал кое-что javascript и nodejs книги недавно и я не помню ее ни в одной из них.

если вы хотите пример, вы можете увидеть RabbitMQ официальный учебник, они есть почти во всех вот один из их примеров:

#!/usr/bin/env node

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';
    var msg = process.argv.slice(2).join(' ') || 'Hello World!';

    ch.assertExchange(ex, 'fanout', {durable: false});
    ch.publish(ex, '', new Buffer(msg));
    console.log(" [x] Sent %s", msg);
  });

  setTimeout(function() { conn.close(); process.exit(0) }, 500);
});

может кто-нибудь объяснить мне, что означает эта строка?

какая разница, если я поставлю или удалите эту строку? В каких случаях мне это нужно?

3 56

3 ответа:

#!/usr/bin/env node и экземпляр a shebang line: the самая первая строка в исполняемом текстовом файле на Unix-подобные платформы это говорит системе, какой интерпретатор передать этот файл для выполнения, через командную строку после магии #! префикс (так называемый shebang).

Примечание: Windows тут не поддержка shebang линий, так они эффективно игнорировать там; на Windows это исключительно данный файл расширение это определяет, что исполняемый файл будет интерпретировать его. однако, вы все еще нуждаетесь в них в контексте npm.[1]

далее, общее обсуждение линий shebang ограничивается Unix-подобными платформами:

в следующем обсуждении я предположу, что файл, содержащий источник код для выполнения узлом.js просто называется file.

  • вы нужна эта строка, если вы хотите вызвать узел.JS в исходном файле напрямую, как исполняемый файл сам по себе-это предполагает, что файл был помечен как исполняемый с помощью команды, такой как chmod +x ./file, который затем позволяет вызвать файл, например, с ./file, или, если он находится в одном из каталогов, перечисленных в $PATH переменной, просто как file.

    • в частности, вам нужна линия shebang для создания командная строка на основе узла.исходные файлы js как часть npm пакета, С CLI (s), который нужно установить npm исходя из стоимости "bin" ключ в пакет package.json file; Также см. ответ как это работает установленных пакетов. Сноска [1] показывает, как это осуществляется на Окна.
  • вы не нужны эта строка для вызова файла явно через node переводчик, например, node ./file


дополнительно справочная информация:

#!/usr/bin/env <executableName> путь портативно указание интерпретатора: в двух словах он говорит: execute <executableName> везде, где вы (первый) найдете его среди каталогов, перечисленных в $PATH переменной (и неявно передайте ему путь к файлу под рукой).

это объясняет тот факт, что данный интерпретатор может быть установлен в разных местах на разных платформах, что, безусловно, относится к node узел.Яш бинарных.

напротив, местоположение env на саму утилиту можно положиться, чтобы быть в то же самое расположение на разных платформах, а именно /usr/bin/env - и задание полное путь к исполняемому файлу требуются в линии shebang.

обратите внимание, что утилита POSIX env идет переназначены здесь, чтобы найти по имени файла и выполнить исполняемый файл в $PATH.
Истинная цель env это управление средой для команды-см. env ' S POSIX spec и полезный ответ кита Томпсона.


также стоит отметить, что узел.JS-это делает синтаксис исключение для строк shebang, учитывая, что они не являются допустимым кодом JavaScript (# не является символом комментария в JavaScript, в отличие от POSIX-подобных оболочек и других интерпретаторов).


[1] в интересах кросс-платформенный последовательности npm создает фантик*.cmd файлы (пакетные файлы) в Windows при установке исполняемых файлов, указанных в пакете (через "bin" свойства). По существу, эти пакетные файлы-обертки мимические Unix shebang функциональность: они вызовите целевой файл явно с исполняемым файлом, указанным в строке shebang таким образом, ваши скрипты должны содержать строку shebang, даже если вы собираетесь запускать их только в Windows - см. ответ Мой для деталей.
Так как *.cmd файлы могут быть вызваны без .cmd расширение, это делает для бесшовного кросс-платформенного опыта: on как Windows, так и Unix вы можете эффективно вызвать npm - установленный CLI своим первоначальным, без расширения именем.

скрипты, которые должны выполняться интерпретатором, обычно имеют shebang line в верхней части, чтобы сказать ОС, как их выполнить.

если у вас есть скрипт с именем foo чья первая строка #!/bin/sh, система прочитает эту первую строку и выполнит эквивалент /bin/sh foo. Из-за этого большинство интерпретаторов настроены так, чтобы принимать имя файла сценария в качестве аргумента командной строки.

имя интерпретатора после #! должен будьте полный путь; ОС не будет искать ваш $PATH найти переводчика.

если у вас есть скрипт для выполнения node, очевидный способ написать первую строку:

#!/usr/bin/node

но это не работает, если node команда не установлена в /usr/bin.

общим обходным путем является использование env команда (которая не была действительно предназначенных для этой цели):

#!/usr/bin/env node

если ваш скрипт называется foo, в ОС будет делать эквивалент

/usr/bin/env node foo

The env команда выполняет другую команду, имя которой указано в ее командной строке, передавая ей все следующие аргументы. Причина, по которой он используется здесь, заключается в том, что env поиск $PATH для команды. Так что если node установлен в /usr/local/bin/node, а ты /usr/local/bin в своем $PATH на вызывает /usr/local/bin/node foo.

основная цель env команда должна выполнить другую команду с измененной средой, добавление или удаление указанных переменных среды перед запуском команды. Но без дополнительных аргументов он просто выполняет команду с неизменной средой, что все, что вам нужно в этом случае.

есть некоторые недостатки этого подхода. Большинство современных Unix-подобных систем /usr/bin/env, но я работал на старых системах, где env команда была установлена в другой каталог. Могут быть ограничения на дополнительные аргументы вы можете пройти с помощью этого механизма. Если пользователь не есть каталог, содержащий на $PATH, или есть какая-то другая команда под названием node, то он может вызвать неправильную команду или не работать вообще.

другие подходы:

  • использовать #! строка, указывающая полный путь к node сама команда, обновление скрипта по мере необходимости для разных систем; или
  • вызов с вашим скриптом в качестве аргумента.

см. также этот вопросмой ответ:) для более подробного обсуждения #!/usr/bin/env трюк.

кстати, в моей системе (Linux Mint 17.2) он установлен как /usr/bin/nodejs. Согласно моим заметкам, он изменился с /usr/bin/node до /usr/bin/nodejs между Ubuntu 12.04 и 12.10. Элемент #!/usr/bin/env трюк не поможет с этим (если вы создали символическую ссылку или что-то подобное).

короткий ответ: Это путь к интерпретатору.

редактировать (длинный ответ): Причина отсутствия косой черты перед "узлом" заключается в том, что вы не всегда можете гарантировать надежность #!/закром. / Бит "/env " делает программу более кросс-платформенной, запуская скрипт в измененной среде и более надежно находя программу-интерпретатор.

вам это не обязательно нужно, но хорошо использовать для обеспечения портативности (и профессионализма)