为什么在bash和dash中读取操作行为不同?

3

这是一个试图了解几种不同shell中read实用程序如何工作的尝试。我发现了一个似乎是bug的区别。

结果是,在dash 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个回答

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 "
以下是POSIX的规定(重点是我的):
如果vars比fields少,则最后一个var应设置为包含以下元素的值: - 与上述正常赋值顺序中的最后一个var对应的字段 - 跟随与最后一个var对应的字段的分隔符 - 剩余的字段和它们的分隔符,忽略结尾的IFS空格
dash不会忽略结尾的IFS空格,因此似乎违反了POSIX。
bash的行为是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接