![dash 中的 vi 编辑模式(/bin/sh)](https://linux22.com/image/1140514/dash%20%E4%B8%AD%E7%9A%84%20vi%20%E7%BC%96%E8%BE%91%E6%A8%A1%E5%BC%8F%EF%BC%88%2Fbin%2Fsh%EF%BC%89.png)
总结:默认 shell 手册页显示有 vi 编辑模式,但set -o vi
实际上并未启用它
在许多 shell 中,包括dash
POSIX 标准都规定set -o vi
将启用 vi 编辑模式,在该模式下交互的shell 可以使用 vi 风格的快捷方式导航行。在dash
(符号链接到的 Ubuntu 默认 shell /bin/sh
)中,此功能不起作用,尽管手册页指定此功能可用。
例子 :
$ dash
$ set -o vi
$ hello wolrd^[I
本来应该发生的是,使用Esc, Shift+i快捷键时光标应该跳转到行首。如您所见,我得到的输出是一个控制字符。我请几个用户在 AskUbuntu Chat 中对此进行测试,他们确认了相同的行为。
请注意,这与终端仿真器无关 - 我在 3 个不同的终端仿真器中测试过它:xterm、gnome-terminal 和 terminator。我已使用其他 shell 测试过它,、bash
和mksh
-ksh93
全部按预期正常工作,因此这是dash
唯一的问题。
答案1
我对此很好奇,所以我从上游 DASH 下载并提取源文件。我检查了 README 文件,该文件应提供有关该程序及其构建选项的信息,但没有,因此我运行了它./configure --help
,其输出包括:
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-libedit Compile with libedit support
因此,看起来自由编辑库用于提供行编辑功能,但这不是构建源代码时的默认设置。我还发现了对邮件列表消息的回复设置-o vi不工作:
我认为这需要在 libedit 支持下构建 dash 才能工作。
我检查了哪些库链接到dash
我的 Ubuntu 服务器上的可执行文件,并注意到libedit
没有包含:
$ ldd /bin/dash
linux-vdso.so.1 => (0x00007fffcfbd6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f013a0b7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f013a475000)
我猜想,Debian 软件包维护者在构建dash
软件包时会忽略此可选配置,因为他们不希望对其他库有外部依赖。他们可能可以静态链接库,但使用as 的sh
主要原因是让 shell 尽可能小巧、快速,以便启动脚本快速运行。dash
sh
编辑: 我只是搜索“libedit dash”最佳结果是这个网站上有非常相似的问题muru 对此给出了很好的回答。
构建支持行编辑的 Dash
对于那些可能感兴趣的人来说,这些是从源代码构建所需的步骤。
下载最新的源码包:
wget http://gondor.apana.org.au/~herbert/dash/files/dash-0.5.9.tar.gz wget http://gondor.apana.org.au/~herbert/dash/files/dash-0.5.9.tar.gz.sha256sum
验证 tarball 的真实性:
sha256sum -c <( awk '/dash/{ print $1 " " $3}' dash-0.5.9.tar.gz.sha256sum ) gpg --verify --auto-key-retrieve dash-0.5.9.tar.gz.sha256sum
提取源文件并进入源目录:
tar -xf dash-0.5.9.tar.gz cd dash-0.5.9
运行
./configure --with-libedit
以创建 Make 文件。但是,除非libedit
安装了库的开发版本,否则此操作会悄悄失败。如果 configure 脚本更详细地发出抱怨会更好,因为它无法明显地找到所需的文件。sudo apt-get install libedit-dev ./configure --with-libedit
构建程序并(可选)将其安装到
/usr/local/bin
:make sudo make install