В bash, почему бы не удалить разрывы строк с помощью echo? - PullRequest
0 голосов
/ 28 февраля 2019

После прочтения этого поста SO , в котором предлагается удалить «разрывы строк» ​​(понимаемые как \n, а не \r\n) в bash с использованием «строк в стиле c» (например, $ {COMMAND //[$ '\ t \ r \ n']}), почему бы вместо этого не использовать echo?Другими словами:

foo=$'Apple\nBanana\nCherry\n'
echo $foo
Apple Banana Cherry

ИЛИ

foo=$(ls -1)
echo $foo
Jenkinsfile README.md exclude_contents install_kit.sh packaging

Вызывает ли это непреднамеренные побочные эффекты или другие проблемы?Если требуется удалить разрывы строк, это кажется более простым, чем ${foo//[$'\n']}

Примечание. Мне известно, что echo "$foo" сохраняет разрывы строк и что если foo содержит \r\n, то echo "$foo"не будет отображать все в одной строке.

1 Ответ

0 голосов
/ 28 февраля 2019

Да, echo $foo вызовет неожиданные побочные эффекты.

Проблемы с расширением пути

Рассмотрим каталог с этими четырьмя файлами:

$ ls
f*  factor  fo?  foo

Теперь,обратите внимание, что echo $foo создает список из восьми имен файлов:

$ foo=$(ls -1)
$ echo $foo
f* factor fo? foo factor fo? foo foo

Это происходит потому, что не заключенный в кавычки $foo в echo $foo подвергается не только разбиению слов (чточто исключает символы новой строки), но также и расширение имени пути .

Если мы используем замену шаблона внутри двойных кавычек, однако мы получаем правильный список файлов:

$ echo "${foo//$'\n'/ }"
f* factor fo? foo

Проблемы с эхом bash

Как указывало @ lurker , echo может действовать удивительным образом.

Рассмотрим каталог с тремя файлами:

$ ls
-e  \none  \text

Теперь попробуйте:

$ foo=$(ls -1)
$ echo $foo

one     ext

Как видите, имена файлов были искажены.Это связано с тем, что echo интерпретировал имя файла -e не как имя файла, а как опцию, которая включает интерпретацию escape-последовательностей.Таким образом, имя файла, чьи символы имеют обратную косую черту, становится символом новой строки.и имя файла, чьи символы представляют собой текст с обратной косой чертой, становится tab-ext.

Команда эха Bash не совместима с POSIX echo, для которого -e рассматривается как текст для печати,Таким образом, код, основанный на echo, не является переносимым.По этой причине, среди прочего, часто рекомендуется , чтобы новый код использовал printf вместо echo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...