Баш, кажется, конвертировать LF в LFCR - PullRequest
0 голосов
/ 16 мая 2018

Кажется, что Bash конвертирует LF в LFCR. Действительно, вот пример ниже, который описывает, что:

text=$(echo -e "foo\nbar\ntir")

При установке IFS на конец строки LF:

IFS=$(echo -e "\n")

\n в строке text не интерпретируется, как показано ниже:

for w in $text ; do echo ${w}';' ; done

Выход:

foo
bar
tir;

Здесь символ ";" Использование в качестве маркера показывает, что $text содержит только один элемент, и поэтому \n не интерпретируется, хотя он был установлен как IFS.

Но теперь, при установке IFS в конец строки LFCR:

IFS=$(echo -e "\n\r")

вывод предыдущей команды превращается в:

foo;
bar;
tir;

Маркер ";" показывает, что $text содержит три элемента и, таким образом, \n в $text интерпретируется как \n\r (LFCR), установленный как IFS.

Так почему же Bash конвертирует LF в LFCR? Если это не так, каково основное объяснение, пожалуйста?

1 Ответ

0 голосов
/ 16 мая 2018

$IFS фактически устанавливается в пустую строку.

$ IFS=$(echo -e "\n")
$ echo "[$IFS]"
[]

Когда $(...) захватывает вывод, он удаляет завершающие символы новой строки.Вы можете установить $IFS на новую строку, используя $'...', синтаксис оболочки, который интерпретирует escape-последовательности, избегая проблемы обрезки.

$ IFS=$'\n'
$ echo "[$IFS]"
[
]
$ text=$'foo\nbar\nbaz\n'
$ printf '%s;\n' $text
foo;
bar;
baz;
...