Можно ли иметь такой код:
#! /usr/local/bin/node
console.info("Hello world")
Что я также могу запустить в браузере?
У меня есть скрипт, который я запускаю локально, и я хочу запустить его в браузере, но сейчас мне нужно «перекомпилировать» его для цели браузера только для удаления строки hashbang.
Я не могу придумать, как это обойти. Есть идеи?
Редактировать: мое использование заключается в том, что я не хочу иметь 2 файла, так как я хочу иметь возможность выполнять текущий файл во время работы над ним, а также обслуживать его через Интернет. Я думаю, что решение должно состоять в том, чтобы либо скомпилировать его для браузера во второй файл, либо использовать альтернативу #! это хорошо работает с javascript.
Обратите внимание, что это официально называется shebang, вы можете найти лучший результат поиска по этому ключевому слову.
Спасибо @Ferrybig, но не могли бы вы уточнить, что вы подразумеваете под «официально»?
@Breck Просто сравните поисковые тренды от Google, и вы обнаружите, что использование термина shebang
значительно превосходит использование термина hashbang
. Оба термина технически правильны, но shebang
является стандартным.
Если вы когда-либо использовали только bash, вы можете воспользоваться одной функцией (?!) bash: bash выполняет скрипты без шебанга, используя bash. Другие оболочки могут оставить это на усмотрение ОС, которая вместо этого обычно использует /bin/sh
. Например:
bash-5.0$ echo 'echo $1 $BASH_VERSION' > foo.sh
bash-5.0$ for sh in sh bash dash ksh zsh; do $sh -c "./foo.sh $sh"; done
sh 3.2.57(1)-release
bash 5.0.7(1)-release
dash 3.2.57(1)-release
ksh
zsh 3.2.57(1)-release
(/bin/sh
это ссылка на старую версию bash для macOS.)
Итак, у вас может быть такой файл:
///usr/local/bin/node <(tail -n +1 "$0"); exit $?
console.info("Hello world")
Если вы запустите это в браузере или другом средстве запуска JavaScript, первая строка должна быть проигнорирована как комментарий.
Если вы запустите это как скрипт в bash, первая строка говорит ему запустить ///usr/local/bin/node
, используя подстановку процесса с tail
, чтобы передать остальную часть файла узлу, а затем завершает работу:
bash-5.0$ cat foo.js
///usr/local/bin/node <(tail -n +1 "$0"); exit $?
console.info("Hello world")
bash-5.0$ ./foo.js
Hello world
Этот трюк может работать и с ksh. ///
в начале пути не должно вызывать проблем — три или более /
в начале пути эквивалентны одному /
.
Но я бы настоятельно рекомендовал вам вместо этого использовать скрипт-оболочку, как это предлагается в комментариях.
Вот такой умный лайфхак я и искал! Я только что сделал: "///usr/local/bin/node имя файла; выход;" что гарантировало, что я получил правильный cwd. Теперь, если вы извините меня, я собираюсь добавить шаг сборки и сделать все «правильным» способом. Но счастье есть.
У вас есть скрипт с
#! /usr/local/bin/node
, который просто вызывает другой файл и использует этот файл в браузере?