Меня попросили добавить скрипт 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.
Попробуйте shellcheck.net для получения полного файла.
Эта ошибка не появлялась до того, как я добавил этот код, поэтому я думаю, что в опубликованном мной скрипте есть какой-то дефект.
Может ли быть идентичная строка в выводе eval
?
Диагностика Shellcheck полезна для решения проблемы. Пожалуйста, отредактируйте свой вопрос и включите правильно отформатированную информацию о проверке оболочки внизу вашего вопроса. Все еще кажется возможным, что проблема возникает из-за некоторого несоответствия перед строкой 126. (Удалите комментарий, он просто увеличивает время, затрачиваемое читателем). удачи!
Ваш файл заполнен символами, отличными от 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 моей исследовательской группы, куда импортировались эти странные символы. Спасибо!
Перед тем, что вы показываете, много кода; там может быть ошибка, которая не обнаруживается до строки 129.