Bash似乎将LF转换为LFCR

时间:2018-05-16 10:44:28

标签: bash separator carriage-return linefeed

似乎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=$(echo -e "\n\r")

但是现在,在将IFS设置为LFCR行尾时:

foo; bar; tir;

上一个命令的输出变为:

$text

标记“;”表明\n包含三个元素,因此$text中的\n\r被解释为glue(LFCR)设置为IFS。

那么,为什么Bash似乎将LF转换为LFCR?如果没有,那么基本的解释是什么?

1 个答案:

答案 0 :(得分:3)

$IFS实际上被设置为空字符串。

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

$(...)捕获输出时,它会删除尾随换行符。您可以使用$IFS shell语法将$'...'设置为换行符,该语法解释转义序列,同时避免修剪问题。

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