Linux Bash-IFS,在函数调用中被破坏
平台CentOS Linux 7.6.1810版,在bash中工作。 GNUBash,版本4.2.46(2)-发行版(x86_64-redhat-linux-GNU) 这是我看到的一个习惯用法,通常用于在bash中解析文本,特别是用于从函数返回多个值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 <
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