我观察到在 macOS 上使用 read 时 zsh 和 bash 之间的差异。
使用 bash 脚本
echo "characters" | while IFS= read -d '' -n 1 a; do printf %s "$a-"; done
生产
c-h-a-r-a-c-t-e-r-s-
而在 zsh 上我没有输出也没有错误是否可以使用 read 逐个字符地进行迭代?
答案1
bash 和 zsh 中命令的选项read
有显著差异。在这种情况下,问题在于-n
两者的含义完全不同:在 bash 中,它表示要读取多少个字符,而在 zsh 中,它修改-p
或-l
选项(与完成功能有关,与此处无关)。
在 zsh 中,您可以使用-k
指定要读取的字符数,但它也默认从终端而不是 stdin 读取,因此您还必须添加-u 0
以告诉它从 stdin 读取。
长话短说:在 zsh 中,用于read -n '' -k 1 -u 0 somevar
从 stdin 读取单个字符。
read
顺便说一句, bash 和 zsh(以及其他 shell)之间还有许多区别。POSIX 标准仅指定-r
选项;其他一切都是非标准的添加,并且不同 shell 的扩展之间的任何相似性都应被视为一个幸福的意外。
答案2
为了以最少的改动重现原始海报感兴趣的内容,下面是一些基本相同的内容,以及输出:
➜ ~ echo "characters" | while IFS= read -u 0 -k 1 a; do printf %s "$a-"; done
结果是:
c-h-a-r-a-c-t-e-r-s-
-%
注意行中的多余字符。我还没有详细研究过,但它输出了在末尾找到的换行符,然后是 a,-
然后我怀疑这%
与流的结尾有关。