TLDR:
- Строки Shebangs добавляются поверх файлов командной строки. Строка сообщает системе, какой исполняемый файл должен использоваться для запуска текущего файла. Строка Шебанга выглядит примерно так:
#!/usr/bin/env node
Приведенная выше строка означает: выполнить с помощью интерпретатора узла, используя путь поиска программы, чтобы найти его.
2. Система ищет командные файлы или исполняемые файлы во всех каталогах, на которые указывает переменная среды PATH
. Вы также можете запускать различные исполняемые файлы сценариев, используя правильный синтаксис shebang.
3. Таким образом, чтобы иметь действительную команду, в основном вам нужно иметь исполняемый файл в одном из каталогов PATH
и исправлять Шебанг для правильных исполняемых файлов.
Вы когда-нибудь задумывались, как вообще работают пользовательские команды. 🕺 Я сегодня задался этим вопросом и взялся за задачу покопаться в этом подробнее.
Я постараюсь сделать его простым, потому что кто не любит простоту.
Прежде чем мы начнем, давайте определим нашу конечную цель. Мы хотим запустить скрипт из командной строки, используя только их имя!!
Допустим, у нас есть файл с именем somework.js
.
Предположим, что единственное содержимое файла:
console.log("Hello World")
Как вы будете работать в nodejs?
Вы запустите его примерно так: node somework.js
Теперь, если я хочу запустить этот скрипт без команды node
. Что-то вроде этого:
somework
Это должно работать так же, как и с командой node. Он должен вывести Hello World
в терминал.
Давайте посмотрим на различные элементы, задействованные при выполнении команды.
Она взорвалась
Я работаю в основном в экосистеме javascript, поэтому у меня достаточно хорошее представление о том, как работают команды. Я знал, что будет достаточно поставить поле bin
в поле package.json
и указать на ваш скрипт (Читать дальше).
Я никогда не возвращался, чтобы выяснить, что происходит после этого.
На этот раз мне больше понравилось с таким отношением.
Я начал просматривать один из bin
файлов в node_modules
Одной вещью, которую я мог видеть, была специальная строка поверх файла, которая выглядела примерно так:
#!/usr/bin/env node
Если у вас есть приложение nodejs, проверьте любой файл в папке node_modules/bin
. Вы должны найти аналогичную строку.
Я чувствовал, что это интересно. Я снова поискал. и попал на эту ссылку. Они называются шебанг | хэшбанг | фунт взрыва | хэш-код
Оказалось, что shebang — это директива интерпретатора.
Ваааааа!! 😲 😲
Но что такое интерпретатор-директива? Проще говоря, это просто способ сообщить системе, как реагировать на вводимые вами команды (какой исполняемый файл нужно запустить?).
Простыми словами, если есть такая строка:
#!/usr/bin/env node
Это означает: выполнить файл с помощью интерпретатора узла, используя путь поиска программы, чтобы найти его.
Мы знаем, что хотим запустить файл nodejs, поэтому мы должны добавить строку в начало нашего файла.
Содержимое файла стало бы таким:
#!/usr/bin/env node
console.log("Hello World")
Дайте исполняемый доступ к файлу.
БЕГ
chmod +x somework.js
Будет ли этого достаточно?
Помните, что есть еще одна часть, которая
Используя путь поиска программы, чтобы найти его.
Что это обозначает? Давайте посмотрим, что в следующем разделе.
ДОРОЖКА
Нам нужно выяснить, как система ищет исполняемые файлы. Опять же, я искал его. и тут наткнулся на эту ссылку.
Примечание. Это только последние ссылки. На самом деле мне потребовалось гораздо больше времени, чтобы добраться до этих ссылок.
Теперь вернемся к делу
Как гласит определение в Википедии:
PATH — это переменная среды в Unix-подобных операционных системах, DOS, OS/2 и Microsoft Windows, указывающая набор каталогов, в которых находятся исполняемые программы
Хм, отлично!! Но как мы увидим, каково значение PATH
прямо сейчас в моей системе?
RUN (должно работать на терминалах на базе Linux)
echo $PATH
Примечание: Для ОС Windows проверьте следующую ссылку
Вы получите что-то вроде этого в качестве вывода:
/Users/wolfgupta/.nvm/versions/node/v14.15.3/bin:/Applications/mongo/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Apple/usr/bin:$GOPATH/bin:$GOROOT/bin:/Users/wolfgupta/Library/Android/sdk/emulator:/Users/wolfgupta/Library/Android/sdk/tools:/Users/wolfgupta/Library/Android/sdk/tools/bin:/Users/wolfgupta/Library/Android/sdk/platform-tools:/usr/local/mysql/bin
Это набор каталогов, в которых ищутся файлы с тем же именем, что и у команды. Файлы (somework.js) могут содержать логику.
Это должен быть очень простой поиск в Google. Я оставлю эту задачу вам, ребята.
Вот некоторые из ссылок, которые могут оказаться полезными.
Если вы используете MacOS/Linux. Следует изменить ~/.bashrc , ~/.zshrc и т.д.
Если вы действительно хотите проверить другие общие определения команд nodejs, которые вы используете ежедневно.
Выполнить
cd /usr/local/bin ls
вы можете сделать vi
для любого из перечисленных файлов, чтобы лучше понять команды
Теперь, чтобы преобразовать node somework.js
в somework
. мы сначала переименуем файл просто в somework
без расширения, а затем переместим его в /usr/local/bin
Выполнить
mv ./somework /usr/local/bin
Теперь просто закройте текущую вкладку терминала и откройте новую вкладку.
Выполнить
somework
Вы должны увидеть красивое Hello World
на терминале.
Это о узле, как насчет того, если вы парень python
и хотите написать свой скрипт на python. Вы можете очень хорошо сделать это с помощью shebangs
Измените содержимое файла в файле somework
в /usr/local/bin на
#!/usr/bin/env python
print("Hello World!")
Примечание. Убедитесь, что на вашем компьютере установлено python
.
В этом файле вы можете написать любой скрипт на Python, и он будет работать так, как работала версия файла nodejs.
Есть так много других деталей, которые я не упоминаю здесь. Но да, вы определенно можете использовать эту статью как хорошую отправную точку для создания утилит командной строки для вашего программного обеспечения.
Наконец, желаю всем вам отличного нового 2021 года. Пусть мир станет лучше для всех нас в ближайшие годы.
Первоначально опубликовано на https://simbathesailor.dev.