Я подозреваю, что ваш сценарий может иметь окончания строки в стиле DOS. В DOS (и Windows) каждая строка текстового файла заканчивается возвратом каретки (по-разному обозначается как \r
или ^M
), за которым следует перевод строки (\n
или ^J
). Текстовые файлы Unix, с другой стороны, заканчивают каждую строку простым переводом строки. Если вы дадите Unix-инструменту (например, bash) файл в формате DOS, он будет интерпретировать возврат каретки как часть строки и запутается. В этом случае мне кажется, что FILE фактически устанавливается в /u0146121/bin/list.txt^M
, которого не существует, и когда оболочка сообщает о проблеме, возврат каретки приводит в замешательство терминал и конец сообщение об ошибке печатается поверх начала.
Чтобы проверить, попробуйте напечатать ваш скрипт с помощью cat -v /path/to/script
- если вы видите ^ M в конце строк, у вас есть файл в формате DOS. Возможно, в вашей системе есть команда для ее перевода, но имя команды может быть другим (например, это может быть dos2unix
или fromdos
или ...). Если вы не можете найти соответствующую команду, вы можете использовать этот тривиальный скрипт на Perl:
perl -pi -e 's/\r//g' /path/to/script