有 POSIX shell 替代 read -e 吗?

有 POSIX shell 替代 read -e 吗?

如何从通用 (POSIX) shell实现read -e(通过 开启行编辑readline并可在 中使用) 的效果?bash我不想仅仅因为这个命令而失去 POSIX 兼容性。

答案1

readline是一个 GNU 项目(与 一起开发bash)。还有其他替代方案,例如 BSD libedit,并且所有 POSIX shell 都有自己的行编辑器,要么特定于 shell,要么基于至少实现一种vi编辑模式的库(POSIX 指定的唯一一个,尽管大多数也支持emacs模式(POSIX 未指定,因为 RMS 反对))。

然而,POSIX 仅指定 shell 命令行的行编辑模式,而不是read.

ksh93但确实支持它read(前提是 stdin 和 stderr 在终端设备上)。在那里,您可以执行以下操作:

set -o emacs
IFS= read -r 'line?prompt: '

等效zsh的是vared(变量编辑器)内置:

line=; vared -p 'prompt: ' line

这是最丰富的功能,具有历史处理以及按键绑定和完成的完全自定义。

read -ebash具体的。

IFS= read -rep 'prompt: ' variable

没有 POSIX 等效项。 POSIXly,您可以开始vi(由 POSIX 指定)编辑临时文件并将该文件的内容读取到变量中。

或者,您可以寻找zsh/ bash/ksh93rlwraplibreadline 周围其他包装器之一的可用性,或者socat(假设它是在支持下构建的readline)并使用其中任何一个(如果可用)来读取该行,或者恢复为普通readvi如果不可用。

或者用那个LE在这个类似的问答中看到行编辑器功能它实现了一个emacs类似有限的行编辑器。

答案2

POSIXread仅支持-r(能够读取反斜杠)。除非您为稍后解析的文件启动编辑器,否则无法要求用户输入并提供类似命令行的编辑。

相关内容