Синтаксическая ошибка рядом с токеном в сценарии bash, инициализирующем conda

Меня попросили добавить скрипт BASH в файл .bashrc сервера, чтобы я мог затем инициализировать conda.

Когда я захожу на сервер, я получаю следующее сообщение:

Last login: Wed Aug 28 16:57:04 2024 from {IP ADDRESS}

-bash: /home/{username}/.bashrc: line 129: syntax error near unexpected token `then' 

-bash: /home/{username}/.bashrc: line 129: `    if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then' 

Вот код:

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup = "$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/opt/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH = "/opt/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

Я запустил bash-скрипт через Shellcheck и выдал следующее:

Line 126: if [ $? -eq 0 ]; then ^-- SC1046 (error): Couldn't find 'fi' for this 'if'. ^-- SC1073 (error): Couldn't parse this if expression. Fix to allow more checks. 
Line 129:     if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then ^-- SC1047 (error): Expected 'fi' matching previously mentioned 'if'. >> ^-- SC1072 (error): Unexpected keyword/token. 
Fix any mentioned problems and try again

Может ли кто-нибудь увидеть ошибку?

Редактировать: Файл /opt/anaconda3/bin/conda определенно присутствует, а также файл /opt/anaconda3/etc/profile.d/conda.sh.

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

chepner 28.08.2024 17:17

Попробуйте shellcheck.net для получения полного файла.

0stone0 28.08.2024 17:17

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

Robbie Mallett 28.08.2024 17:18

Может ли быть идентичная строка в выводе eval?

John Gordon 28.08.2024 17:30

Диагностика Shellcheck полезна для решения проблемы. Пожалуйста, отредактируйте свой вопрос и включите правильно отформатированную информацию о проверке оболочки внизу вашего вопроса. Все еще кажется возможным, что проблема возникает из-за некоторого несоответствия перед строкой 126. (Удалите комментарий, он просто увеличивает время, затрачиваемое читателем). удачи!

shellter 28.08.2024 20:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш файл заполнен символами, отличными от ASCII. Например, вот шестнадцатеричный дамп строки 7:

$ sed -n 7p foo.sh  | xxd
00000000: e280 afe2 80af e280 af20 6966 205b 202d  ......... if [ -
00000010: 6620 222f 6f70 742f 616e 6163 6f6e 6461  f "/opt/anaconda
00000020: 332f 6574 632f 7072 6f66 696c 652e 642f  3/etc/profile.d/
00000030: 636f 6e64 612e 7368 2220 5d3b 2074 6865  conda.sh" ]; the
00000040: 6e0a                                     n.

Последовательность байтов e280f представляет собой УЗКОЕ НЕПРЕРЫВНОЕ ПРОСТРАНСТВО, и bash не знает, что с этим делать. Замените все пробелы реальными пробелами; в остальном код правильный.

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup = "$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2>/dev/null)"
if [ $? -eq 0 ]; then
  "$__conda_setup"
else
  if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
    . "/opt/anaconda3/etc/profile.d/conda.sh"
  else
    export PATH = "/opt/anaconda3/bin:$PATH"
  fi
fi
unset __conda_setup
# <<< conda initialize <<<

Да, это было правильно! Я скопировал код с вики-страницы MS Teams моей исследовательской группы, куда импортировались эти странные символы. Спасибо!

Robbie Mallett 28.08.2024 18:29

Другие вопросы по теме