Что именно делает"/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 ответа:
#!/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 " делает программу более кросс-платформенной, запуская скрипт в измененной среде и более надежно находя программу-интерпретатор.
вам это не обязательно нужно, но хорошо использовать для обеспечения портативности (и профессионализма)