在 Bash 和 ZSH 中读取

在 Bash 和 ZSH 中读取

我观察到在 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,-然后我怀疑这%与流的结尾有关。

相关内容