Синтаксическая ошибка рядом с неожиданным маркером linux

Обновлено: 06.07.2024

Вы показываете пример, в котором пытаетесь запускать функции javascript напрямую из командной оболочки bash.

Переименовал переменные что бы уж точно ничего не упустить, думал проблема в этом, потом понял, что не установил библиотеку, сделал, показывает

Я делаю вызов не верный? Прочитал вопросы других, принял к сведению все возможные варианты, но что то я не так понял что ли?

А вы разобрались в том, зачем вообще нужен babel-node?

Мне нужно опубликовать пакет, а затем сделать вызов npx babel-node src/bin/brain-games.js ?

Ну вот я сделал, как написано в уроке. У меня не выходит вызвать программу через babel-node а так же выполнить отладку публикации из прошлого шага(

В общем я в тупике, ибо программа не запускается, опубликовать пакет не выходит. Какой у меня выход из ситуации? У меня уже 2 не стыковки.

Ну вот я сделал, как написано в уроке.

Что конкретно вы сделали?

Ввёл команду npx babel src --out-dir dist, другие моменты описанные в уроке я сделал несколько дней до этого. Отладить публикацию не выходит комагда --dry run проходит успешно, а вот npm link нет. Я так понимаю что внести публикацию нужно было в пред шаге, но я вот не могу этого сделать.

В итоге что мне сделать? Как мне запустить brain-games? Babel установлен вроде как.

Я так понимаю (судя по другим вопросам) интерпретатор не понимает нового синтаксиса, потому что я что не сделал, может в конфиг файле? Всё что говорится в уроке про babel я сделал.

Всё что говорится в уроке про babel я сделал.

А что вы сделали?

Вставил указанное в конфиг файл

В созданном файле prepublish написал

Вставил указанное в конфиг файл

Прямо так всё и вставили?

Вы не понимаете, что засунули в один файл два разных конфига? Урок внимательно проходили?

Вообще честно была такая версия в голове, я сделал вставку, подумав что это необходимо для старта. Ну я так понял, что нужно оставить только это:

Почему на третьем шаге ваш репозиторий на гитхабе ещё пуст?

Вообще честно была такая версия в голове

Об этом прямо в уроке написано, без всяких версий.

Вчера я пытался синхронизировать свой локальный репозиторий, я установил git, файлы из него импортируется в мой проект (из github проекта в лок репозиторий), но вот залить изменения у меня не выходит. Я ещё неопытен в этой ОС поэтому не удивляйтесь тому что я слабо ориентируюсь. Ну это одна проблема, к ней я вернусь. Вот если я настроил конфиг, получается что проблема в чём то другом если текст ошибки не изменяется?

Трудно что-то конкретное сказать, разберитесь с гитом, залейте свой проект на гитхаб, чтобы можно было его посмотреть.

У меня получилось синхронизировать репозитории и добавить файлы, с одной проблемой разобрался.

Итак, с гитом я проблему решил, что на счёт синтаксической ошибки?

В созданном файле prepublish написал

  1. А зачем вы создали этот файл с именем prepublish ?
  2. Зачем вы создали файл с именем build ?
  3. Makefail ---> Makefile
  4. Я не вижу, чтобы у вас были прописаны и установлены зависимости, связанные с babel

1 и 2 так я понял указания из предыдущего шага (Создайте npm-скрипт build, Создайте npm-скрипт он же и хук prepublish), 3 переименовал, в гит внёс изменения.

Создайте npm-скрипт build, Создайте npm-скрипт он же и хук prepublish

Я понимаю, что с собой они представляют, но в рамках проекта затрудняюсь. Судя по json формату должно быть в одном из файлов тоже формата, package-lock.json или package.json, я затрудняюсь с ответом.

Скрипты прописываются в конфигурационном файле package.json

Сделал, при вызове выдаёт вот это

или ещё вот так

У вас путаница с файловыми путями:
alex@debian:

при запуске babel-node конфигурационный файл babel.config.js должен быть в директории запуска

Т.е в папке bin вместе с brain-games.js? Вы знаете я из разных мест пытался вызывать даже после перемещения конфиг файла, синтаксические ошибки(

Конфигурационный файл бабеля должен лежать в корневом каталоге проекта, оттуда и делаем запуск всех команд

Ну он там и был всё время, результат синтаксическая ошибка(

Что можно сделать ещё?

В одном из прошлых комментариев я написал вам:

Я не вижу, чтобы у вас были прописаны и установлены зависимости, связанные с babel

но вы на это никак не отреагировали

Так, я могу ошибаться, я так понимаю мне нужно в файле package.json и что вставить в "dependencies" ?

В начале я вижу как был небольшой прогресс, в дирекории dist было создана копия, вызвать не получилось может библиотеку readlineSync не установил, хотя я её устанавливал через консоль как в ссылке к уроку показано.

2 ответа

Предостережение во второй строке:

Которые должны быть:

/.bash. не может быть интерпретирован как комментарий оболочки, но как часть аргумента alias команда.

Я также рекомендовал бы разместить псевдонимы в файле

/.bash_aliases который будет получен, когда

/.bashrc выполняется, поэтому вам не нужно редактировать

/.bashrc и в конечном итоге испортить это.

Если вы настаиваете на размещении псевдонимов в

/.bashrc добавьте их в конец файла.

Чтобы глубже понять эту тему, обратитесь к прекрасному ответу Элии на ваш вопрос.

mook765 совершенно правильно определил причину проблемы, и решение, предложенное в этом ответе, исправляет синтаксическую ошибку, но я рекомендую вам решить ее по-другому.

Можно добавить определения псевдонимов в .bashrc , но лучше не помещать их - или что-нибудь - в самый верх этого файла.

Мы склонны думать о .bashrc как источник только интерактивных оболочек, но на самом деле это не так. Неинтерактивные удаленные оболочки ( если bash идентифицирует их как таковые) также являются источником .bashrc , Вот почему Ubuntu по умолчанию .bashrc 1 содержит этот код: 2

В основном все, что вы положили в .bashrc , включая определения псевдонимов, но не ограничиваясь ими, должен находиться где-то ниже. Вы должны когда-либо ставить свой собственный код над этим кодом, только если у вас есть для этого явная причина, что встречается редко.

Вы можете поместить свои определения псевдонимов в любом месте ниже этого кода, хотя я предлагаю разместить их в самом конце файла. Или вы можете предпочесть разместить их рядом с некоторыми из существующих определений псевдонимов в файле. Или вы можете поместить их в отдельный файл

/.bash_aliases , который вы можете создать, если он не существует. 3 Любой из этих вариантов в порядке.

Вот один из наиболее распространенных примеров странных и неожиданных эффектов, когда ваш собственный код выше проверки интерактивности. Эта конкретная проблема возникает, когда код производит вывод, что не должно происходить из определения псевдонима. (Псевдоним, когда он используется, может, конечно, расширяться до команды, которая производит вывод, но синтаксически правильное определение псевдонима не должно производить вывод, если только -p опция передается alias . Я не ожидаю, что определения псевдонимов обычно вызывают проблемы, даже если они запускаются в неинтерактивных оболочках. Неинтерактивные оболочки не выполняют расширение псевдонимов по умолчанию (хотя это просто значение по умолчанию). Однако, если они в конечном итоге приводят к неожиданным эффектам, то, вероятно, никто не подумает проверить это.

Это, по общему признанию, является лишь слабой причиной, чтобы не ставить определения псевдонимов выше проверки интерактивности .bashrc , Однако, поскольку это абсолютно бесполезно по сравнению с размещением их в другом месте файла, я рекомендую придерживаться общего подхода, заключающегося только в том, чтобы поместить код выше той проверки, что вы намеренно собираетесь работать в неинтерактивных удаленных оболочках.

Другой интересный аспект этого - то, почему это была синтаксическая ошибка:

1 по умолчанию .bashrc в Ubuntu можно посмотреть на /etc/skel/.bashrc До тех пор, пока вы не изменили этот файл. Это копируется в домашний каталог пользователя при его создании. Как и многие файлы в Ubuntu, этот файл минимально отличается от Debian, дистрибутива, из которого происходит Ubuntu. Рекомендации в этом посте применимы как к Bash в Debian, так и к Ubuntu, но не обязательно применяются без изменений к Bash во всех системах GNU/Linux.

2 Также возможно, хотя и редко, чтобы начать bash как неинтерактивная оболочка для входа. Как интерактивные оболочки входа, такие источники оболочки

/.profile автоматически и по умолчанию

./profile в Ubuntu явные источники

/.bashrc , Помимо предотвращения непреднамеренного выполнения в неинтерактивных удаленных оболочках, добавление ваших дополнений в

/.bashrc ниже проверка интерактивности также предотвращает ее непреднамеренное выполнение в странном случае неинтерактивной оболочки входа в систему.

3 Ubuntu по умолчанию .bashrc проверяет, если

/.bash_aliases существует ( [ -f

/.bash_aliases ] ) и источники его ( .

/.bash_aliases ) если это так. Код, который вы разместили, подтверждает, что ваш измененный .bashrc Файл действительно выполняет эти действия - похоже, единственным изменением в нем был код, который вы добавили вверху.

Примечание: вы также должны поставить пробелы после [ и до ] .

Причиной ; переноса строки или является то, что условная часть if оператора является просто командой. Любая команда любой длины, если быть точным. Оболочка выполняет эту команду, проверяет состояние завершения команды и затем решает, выполнять ли then часть или else часть.

Поскольку команда может быть любой длины, для обозначения конца условной части необходим маркер. Это ; или новая строка с последующим then .

Причина пробелов в [ том, что [ это команда. Обычно это встроенная оболочка. Оболочка выполняет команду [ с остальными параметрами, включая ] обязательный последний параметр. Если вы не поставите пробел после того, [ как оболочка попытается выполнить [whatever как команду и завершится ошибкой.

Причина для пространства до того ] похожа. Потому что в противном случае он не будет распознаваться как собственный параметр.

Это было на месте, однако теперь я получаю test.sh: line 6: [: missing ] '` @lesmana. Хороший способ сначала дать неправильный ответ, затем продолжить редактирование, прежде чем кто-то другой предоставит правильный ответ. Пожалуйста, попробуйте дать правильный ответ с первого раза. Я не считаю свой первый ответ неправильным. На самом деле, это было «пятно на». Это просто не решило всех проблем в вопросе. if это синтаксис, это не обычная команда. Это зарезервированное слово. В отличие от многих других языков программирования, оболочка не распознает зарезервированные слова везде, только когда они являются первым словом команды (с некоторыми тонкостями). Благодарю за разъяснение. Я знаю, что if это синтаксис. Я пытался сообщить, что условие условие if не ограничено определенной формой по синтаксису. Я отредактировал текст. Надеюсь, теперь стало понятнее.

Вы можете легко проверить свои сценарии оболочки, используя ShellCheck онлайн (также доступный как самостоятельный инструмент).

В этом случае он укажет, что оператору if нужны пробелы после [ и до ] , и что вам нужно ; (или символ новой строки) перед then той же строкой.

Когда вы исправите это, он будет рассказывать вам, что USER_NAME он используется без какой-либо инициализации. Это потому, что у вас также есть user_name переменная (регистр имеет значение). То же самое относится и к PASS и pass .

Он также говорит, что вы должны использовать, read -r чтобы остановить read искажения \ (например, это может быть важно для паролей), и что вы должны ставить в кавычки переменные при вызове, sqlplus чтобы предотвратить случайное выполнение оболочкой слежения за именами файлов и разделения слов (опять же, это важно, если пароль, например, содержит символы, такие как * или пробелы).

Отступ кода также сделает его более читабельным:

Здесь я также сделал возможным использование паролей с начальными или конечными пробелами, временно установив IFS пустую строку для чтения пароля read .

Логика также была изменена, чтобы выручить, если $ORACLE_SID / $sid есть Test . Это позволяет избежать основной рабочей части скрипта в if ветке.

Читайте также: