Відповідний хешбанг для сценаріїв Node.js


94

Я намагаюся створити сценарій для node.js, який буде працювати в різних середовищах. Особливо для мене, я переключаюся між OS X та Ubuntu. У першій Node встановлюється як node, а в другій - nodejs. У верхній частині мого сценарію я можу мати:

#!/usr/bin/env node

або

#!/usr/bin/env nodejs

Я вважаю за краще, щоб сценарій виконувався як виконуваний файл для будь-якого середовища, доки встановлений вузол, а не мав би той чи інший вказувати команду ( ./script-name.jsпроти node script-name.js).

Чи є спосіб вказати хешбанг резервної копії або сумісний у будь-якому випадку для node.js?


ви можете зробити сценарій оболонки-обгортки для виклику вашого сценарію, який намагається з’ясувати, де живе вузол і як він називається.
Doon

4
Багато пропозицій у цій відповіді на сайті Unix - unix.stackexchange.com/questions/65235/…
sargant

У мене є скрипт nodejs, який я змінив #!/usr/bin/nodeна, #!/usr/bin/nodejsколи оновив Ubuntu 12.04 до 12.10. І це викликається з обгортки, яка перевіряє обидва. Для обговорення #!/usr/bin/envхакства див. Це питання та мою відповідь .
Кіт Томпсон,

На етапі 3 є пропозиція TC39 під назвою "Граматика хешбанга", яка має на меті стандартизувати використані хешбанги
М.

Відповіді:


150

Якщо ваш сценарій призначений для використання розробниками Node, вам слід абсолютно просто використовувати

#!/usr/bin/env node

і не турбуватися про спроби сумісності з людьми, у яких лише Node встановлений як nodejs.

Обґрунтування:

  • Це те, що роблять круті діти, і якщо ти теж цього не робиш, ти не крутий. Основні проекти вузлів, такі як jshint , karma , bower і навіть npm, просто використовуються #!/usr/bin/env nodeяк shebang для своїх виконуваних сценаріїв.
  • Оскільки це роблять круті діти, кожен, хто працює з Node в Ubuntu, встановив символ /usr/bin/nodeяк посилання на nodejs. Є дуже переглянуті вказівки щодо цього тут, у Stack Overflow та в усьому Інтернеті. Був навіть nodejs-legacyпакет, ціллю якого було створення цього символічного посилання для вас. Люди, які використовують Node, знають, як вирішити цю проблему в Ubuntu, і вони повинні це зробити, якщо хочуть використовувати практично будь-яке програмне забезпечення, коли-небудь написане в Node.
  • Здається, проблема навіть більше не існує в Ubuntu 14.04; Я просто очистив Node і запустив, apt-get install nodejsі він створив /usr/bin/nodeяк символічне посилання на /etc/alternatives/node. Люди, які страждають від цього питання, - це, я підозрюю, зменшується.

Навіть якщо ви націлені на неграмотних людей, ви все одно можете скористатися цим #!/usr/bin/env node, можливо, додавши можливу необхідність створення символічного посилання вручну або встановлення nodejs-legacyпакету до вашої документації щодо встановлення, якщо ви вважаєте це необхідним. Зверніть увагу: якщо хтось із, nodejsале nodeнедоступний, спробує запустити вашу програму за допомогою вищезазначеного шебанга, вони побачать:

/ usr / bin / env: node: Немає такого файлу або каталогу

і погугливши це дасть їм виправлення в першому результаті та багато разів на першій сторінці.

Якщо ви справді, відчайдушно хочете переконатись, що користувач може запустити ваше програмне забезпечення в системі, де nodejsвона доступна, але nodeїї немає (або де nodeнасправді є програма Amateur Packet Radio Node ), тоді ви можете використовувати цей "дворядковий шебанг" від Unix та Linux Stack Exchange :

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

console.log('Hello world!');

але чи справді потрібно це робити, коли майже ніхто інший у світі Вузлів не є?


2
Якщо nodejsперевага надається підтримці виконуваного файлу, можливо, вам стане дещо симпатичніше використовувати шебанг з #!/bin/shта //bin/false || exec "$(command -v nodejs || command -v node)" "$0".
lennartcl

2
Зверніть увагу, що ви не можете передавати аргументи вузлу в Linux , наприклад --experimental-modules, якщо ви використовуєте цей envрядок shebang. Навколо є хаки, але вони потворні .
Дан Даскалеску,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.