如何从通用 (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 -e
是bash
具体的。
IFS= read -rep 'prompt: ' variable
没有 POSIX 等效项。 POSIXly,您可以开始vi
(由 POSIX 指定)编辑临时文件并将该文件的内容读取到变量中。
或者,您可以寻找zsh
/ bash
/ksh93
或rlwrap
libreadline 周围其他包装器之一的可用性,或者socat
(假设它是在支持下构建的readline
)并使用其中任何一个(如果可用)来读取该行,或者恢复为普通read
,vi
如果不可用。
或者用那个LE
在这个类似的问答中看到行编辑器功能它实现了一个emacs
类似有限的行编辑器。
答案2
POSIXread
仅支持-r
(能够读取反斜杠)。除非您为稍后解析的文件启动编辑器,否则无法要求用户输入并提供类似命令行的编辑。