为什么 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
行为是正确的。
这是为了了解读取实用程序如何在多个 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
行为是正确的。