@UniverseElement

Как прочитать файл построчно в bash?

Осваиваю bash. Пытаюсь создать символически ссылки на файлы, но натыкаюсь на следующую ошибку:
ln: не удалось получить доступ к '/usr/share/nginx/html/blabla.txt'$'\r': Нет такого файла или каталога

В конце строки добавляются '$'\r'.
Что такое \r понятно , а откуда берётся доллар и как от них избавиться?

Код:
while read str
        do
                $(ln /usr/share/nginx/html/$str /usr/share/nginx/html/tst/$str)
        done < /home/user/list.txt
  • Вопрос задан
  • 1103 просмотра
Решения вопроса 1
@UniverseElement Автор вопроса
Проблему решил так:

while read str; do 
                str=${str/'\r'/} 
                ln "/usr/share/nginx/html/$str" "/usr/share/nginx/html/tst/$str" 
done < /home/user/list.txt
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@AVKor
Не надо использовать виндовые EOL. В никсах EOL = \n, а в винде EOL = \r\n
Ответ написан
xotkot
@xotkot
хорошо есть и хорошо весьма
это из за правки файлов linux из под windows/macos
для преобразования есть специальные утилиты в linux - это dos2unix/mac2unix и обратные им unix2dos/unix2mac

п.с.
$() здесь лишнее, а неизвестные пути желательно закавычивать, а то вдруг попадется строка с пробелом:
while read str; do
	ln "/usr/share/nginx/html/$str" "/usr/share/nginx/html/tst/$str"
done < /home/user/list.txt
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
Проблему следует решать так:

dos2unix /home/user/list.txt
while read; do
  ln -s "/usr/share/nginx/html/$REPLY" "/usr/share/nginx/html/tst/$REPLY"
done < /home/user/list.txt


P.S. кстати в твоем примере указано просто ln без ln -s, то есть ты хардлинки создаешь вместо символических ссылок.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы