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