为什么阅读在bash和dash中表现不同?

时间:2015-08-07 23:25:59

标签: bash shell dash-shell built-in

这是试图找出read实用程序如何在多个shell中工作。发现差异对我来说似乎是个错误。

结果是破折号用read:

保留尾随空格
dash: <a b     >
bash: <a b>

简而言之:为什么这个代码在bash和dash读取中表现不同?

dash -c 'echo "    a b     " | { read var; echo "<$var>"; }'
bash -c 'echo "    a b     " | { read var; echo "<$var>"; }'

1 个答案:

答案 0 :(得分:5)

以下是展示问题的简便方法:

$ dash -c 'echo "a b     " | { read var; echo "<$var>"; }'
<a b     >
$ bash -c 'echo "a b     " | { read var; echo "<$var>"; }'
<a b>

仅当有两个或多个字段时才会发生这种情况,例如"a b ",而不是只有一个字段,例如"a "

这是what POSIX says(强调我的):

  

如果vars少于字段,则最后一个var应设置为包含以下元素的值:

     
      
  • 对应于上述正常分配序列中最后一个变量的字段

  •   
  • 与最后一个var对应的字段后面的分隔符

  •   
  • 其余字段及其分隔符忽略尾随IFS空格

  •   

dash不会忽略尾随的IFS空格,因此它似乎违反了POSIX。

bash行为是正确的。