我正在开发一个使用 read -k 的 zsh 脚本。如果我像这样执行脚本 ( echo a | myscript
),它将无法获取输入。显然,这是由于 -k 始终使用 /dev/tty 作为标准输入,并且您必须告诉 read 使用标准输入,如read -u0
.
但是,如果我将其更改为 -u0 (这使得之前的情况有效)并在不重定向 tty 的情况下执行我的脚本,它会破坏脚本,它根本不会像在没有 -u0 的情况下执行它一样。
编辑:调试后,问题似乎很简单,使用 -u0 后, -k1 选项不再读取单个字符并停止。在这种情况下,read 的工作方式与没有 -k 时一样,只是缓冲所有输入并在 EOL 到达时立即保存它
EDIT2:经过更多调试后,我知道这与原始模式无法与 -u0 一起使用有关。如果我在读取之前添加 stty raw/cooked 那么它就可以工作(除了现在使用 \r 而不是 \n 处理输入击键),但是当我使用非 tty stdin 执行它时它会中断。
有什么办法可以让两种模式兼容吗?
事实上,我想了解为什么脚本的行为完全不同,无论我是否使用 -u0 读取,fd0 默认情况下与 /dev/tty 相同
read -k
(读N个字符)和read -q
(读y
或n
)有两种操作模式:-u
带有数字,或-p
从用于与当前协进程通信的管道中读取)。在这种情况下,它们只是从文件描述符中读取。没有选项告诉 zsh 从特定源读取,但如果从终端读取,则更改终端模式。
-u0
不过,您可以自己安排:检查标准输入是否是终端,如果是则不要通过。