为什么 read 在 bash 和 dash 中的行为不同?

Why is read acting differently in bash and dash?

这是为了了解读取实用程序如何在多个 shell 中工作。发现了一个对我来说似乎是错误的差异。

结果是 dash 保留尾随空格,read:

dash: <a b     >
bash: <a b>

简而言之:为什么这段代码在 bash 和 dash read 中的表现不同?

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

这里有一个更简单的方法来演示您的问题:

$ 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(强调我的):

If there are fewer vars than fields, the last var shall be set to a value comprising the following elements:

  • The field that corresponds to the last var in the normal assignment sequence described above

  • The delimiter(s) that follow the field corresponding to the last var

  • The remaining fields and their delimiters, with trailing IFS white space ignored

dash 不忽略尾随的 IFS 白色 space,因此它似乎违反了 POSIX。

bash 行为是正确的。