Процитирую мой собственный пост из Мета :
У меня уже есть предпочтительный метод для этого , о котором вы можете прочитать на странице руководства less
в двух местах:
LESS='+/\+cmd' man less
и
LESS='+/LESS[[:space:]]*Options' man less
(Видите, что я там делал?)
Проблема не в tr
, проблема заключается в том, как вы выводите расширение переменной:
echo $PAGE_LINKS
Цитируйте переменную раскрытие:
echo "$PAGE_LINKS"
в противном случае расширение будет проходить через разделение слов в соответствии со значением IFS
(пробел, табуляция, новая строка по умолчанию) и раскрытие имени пути ( *
, ?
, []
).
В вашем случае происходит разделение слов, и каждый элемент, разделенный новой строкой, берется индивидуально и, наконец, отображается как объекты, разделенные пробелом. Использование кавычек предотвратит разделение слов (и расширение имени пути), поэтому все расширение будет считаться единым целым.
Согласно странице руководства bash
для конструкции $ (command)
:
Bash выполняет раскрытие, выполняя команду и заменяя подстановку команды на стандартный вывод команды с удаленными завершающими символами новой строки . Встроенные символы новой строки не удаляются, но их можно удалить во время разделения слов.
Итак, tr
- это не проблема, а bash
либо удаляет символы новой строки, если они завершаются, либо удаляет любые другие символы новой строки во время разделения слов. Это поведение, как задокументировано.
Я считаю, что вы хотите такого поведения в большинстве мест. Если у вас есть файл со списком имен файлов в нем, то:
for FILENAME in $(cat somefile)
do
...
done
Итерация по списку имен файлов. Вы не хотите, чтобы символы новой строки в somefile
испортили ваш список слов, используемых в качестве имен файлов, и, возможно, даже испортили цикл for-do-done.