Linux Bash-IFS,在函数调用中被破坏

Linux Bash-IFS,在函数调用中被破坏,linux,bash,Linux,Bash,平台CentOS Linux 7.6.1810版,在bash中工作。 GNUBash,版本4.2.46(2)-发行版(x86_64-redhat-linux-GNU) 这是我看到的一个习惯用法,通常用于在bash中解析文本,特别是用于从函数返回多个值 IFS=":" read A B <<< $(echo ONE:TWO) 请注意,在第二种情况下,A获取值一两这似乎是bash-4.2中的一个bug,如本文所述。应该在上面的版本上工作 IFS=":" read A B <

平台CentOS Linux 7.6.1810版,在bash中工作。 GNUBash,版本4.2.46(2)-发行版(x86_64-redhat-linux-GNU)

这是我看到的一个习惯用法,通常用于在bash中解析文本,特别是用于从函数返回多个值

IFS=":" read A B <<< $(echo ONE:TWO)

请注意,在第二种情况下,
A
获取值
一两
这似乎是
bash-4.2
中的一个bug,如本文所述。应该在上面的版本上工作

IFS=":" read A B <<< $(echo ONE:TWO)
echo "$A"
ONE TWO
这些结果与您的GNUBash版本相同,版本为4.2.46(2)。当我在调试模式下运行函数
yyy
时(通过在提示符下设置
set-x

上面是调试模式输出的输出片段。如您所见,由于命令替换而打印
echo ONE:TWO
时,由于该行不包含默认
IFS
值(空格/制表符或换行符)的任何字符,因此预计不会发生分词

因此,您可能希望使用
IFS=:
读取整个字符串,希望拆分字符串并将值放入组成变量
A
B
,但不知何故,
字符丢失,字符串
一两
存储为第一个变量值

看看GNUBASH版本4.4.12(1)中函数执行的输出,它展示了正确的行为

++ IFS=:
++ read A B
+++ echo ONE:TWO
++ debug A=ONE
++ echo A=ONE
A=ONE
++ debug B=TWO
++ echo B=TWO
B=TWO
++ echo ONE:TWO
在4.4.0版之前,已经有很多与IFS相关的bug。因此,个人建议将您的
bash
版本升级到更稳定的版本。也看到

版本4.4.0(1)上的类似错误-发布

由于前面提到的原因,当扩展
$(..)
时,您可能希望
ONE:TWO
不会被修改。但是这里也丢失了定界字符,变量
A
设置为
一两

IFS=":" read A B <<< $(echo ONE:TWO)
echo "$A"
ONE TWO

IFS=“:”读取A和B。对于第二种情况,我在单独的行中得到
A=ONE B=TWO
。注意,
echo语法是因为在现实生活中我调用了其他东西。我同意这种行为是出乎意料的——然而,yyy中的行为出乎意料,父母似乎正在影响yyy。非常有趣的是,您的shell可以按预期工作。我注意到您正在使用GNU bash,版本4.4.12,而我支持一些版本4.2.46。感谢您的调查。知道这应该行得通让人放心。
in yyy 
A=ONE B=TWO

===

in yyy 
A=ONE TWO B=

===

in yyy 
A=ONE B=TWO
++ IFS=:
++ read A B
+++ echo ONE:TWO
++ debug 'A=ONE TWO'
++ echo 'A=ONE TWO'
A=ONE TWO
++ debug B=
++ echo B=
B=
++ echo 'ONE TWO:'
++ IFS=:
++ read A B
+++ echo ONE:TWO
++ debug A=ONE
++ echo A=ONE
A=ONE
++ debug B=TWO
++ echo B=TWO
B=TWO
++ echo ONE:TWO
IFS=":" read A B <<< $(echo ONE:TWO)
echo "$A"
ONE TWO