bash read mystery:`read -d''-s -n 1`吃连字符

时间:2016-07-05 09:36:15

标签: bash

我正在尝试使用read中的bash内置来一次读取一个字符。当我对-N 1使用read参数时,这实际上是完美无缺的,但我有一些OSX用户向我报告他们的bash没有这个选项。

所以现在我正在使用以下内容:

$ while IFS= read -r -d'' -s -n 1 char; do echo -n "${char}"; done < filename

这个回声一次回到filename中的每个字符,除了,神秘地,连字符(-)。例如。如果我有

$ cat blah
uh-oh

结果是:

$ while IFS= read -r -d'' -s -n 1 char; do echo -n "${char}"; done < blah
uhoh

文档中没有任何内容表明任何可以表明这一点的内容。如果我将${char}中的echo替换为${#char},则会打印0,其中应该读取连字符。它完全被吃掉了。

如果我放弃-d''它而不是吃换行符,但吃连字符,所以至少有意义,因为换行符是默认分隔符。这似乎是-d''将连字符视为分隔符的错误。

FWIW我有

$ bash --version
GNU bash, version 4.3.42(4)-release (x86_64-unknown-cygwin)

但这是OSX用户首次向我报告的。

1 个答案:

答案 0 :(得分:4)

您实际上未正确设置分隔符选项。

注意额外的空间:

while IFS= read -r -d '' -s -n 1 char; do echo -n "${char}"; done < filename

这很好用。 在您的代码中,分隔符字符设置为-s