3

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

结果是破折号保留带有读取的尾随空格:

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>"; }'
4

1 回答 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 所说的(强调我的):

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

  • 与上述正常赋值序列中的最后一个 var 对应的字段

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

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

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

bash行为是正确的。

于 2015-08-08T00:13:55.150 回答