Ответ 1
TL; DR: ваш script или данные имеют окончание строк CRLF в стиле Windows.
Преобразовать в стиль Unix, удалив возврат каретки.
Как проверить, вернёт ли мой script или данные каретки?
Они обнаруживаются как ^M
в выводе cat -v yourscript
:
$ cat -v myscript
ls -l myfile^M
Если ваш script не имеет их, ваши данные могут - особенно, если вы читаете файлы ini/csv или curl
:
hostname=$(curl https://example.com/loginhost.txt)
ssh "$hostname" # Shows strange error
echo "$hostname" | cat -v # Shows myhost^M
Как удалить их?
Установите редактор, чтобы сохранить файл с окончанием строки Unix, ака "терминаторы строк" или "концевые символы", и сохраните его.
Вы также можете удалить их из командной строки с помощью dos2unix yourscript
или cat yourscript | tr -d '\r' > fixedscript
.
Если вы нашли в своих данных, вы можете передать свой источник через tr -d '\r'
:
hostname=$(curl https://example.com/loginhost.txt | tr -d '\r')
Почему возврат каретки вызывает странные сообщения об ошибках?
Символ "возврат каретки", иначе CR или \r
, заставляет курсор перемещаться к началу строки и продолжать печать оттуда. Другими словами, он начинает переписывать строку с самого начала. Вот почему они обманывают странно:
Intended: ssh: Could not resolve hostname myhost\r: Name or service not known
Written: ssh: Could not resolve hostname myhost\r
Overwritten: : Name or service not known
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Result: : Name or service not knownname myhost