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

3 bash shell built-in dash-shell

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

结果是破折号保留尾随空格,显示为:

dash: <a b     >
bash: <a b>
Run Code Online (Sandbox Code Playgroud)

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

dash -c 'echo "    a b     " | { read var; echo "<$var>"; }'
bash -c 'echo "    a b     " | { read var; echo "<$var>"; }'
Run Code Online (Sandbox Code Playgroud)

tha*_*guy 5

这是一种更简单的方式来演示您的问题:

$ dash -c 'echo "a b     " | { read var; echo "<$var>"; }'
<a b     >
$ bash -c 'echo "a b     " | { read var; echo "<$var>"; }'
<a b>
Run Code Online (Sandbox Code Playgroud)

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

是POSIX所说的(强调我的):

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

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

  • 跟在对应于最后一个var的字段之后的分隔符

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

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

bash行为是正确的.