短划线中的vi编辑模式(/ bin / sh)
TL; DR :默认的shell手册页说有vi编辑模式,但是set -o vi
实际上并没有启用它
在许多shell中,包括dash
,POSIX标准规定set -o vi
将启用vi编辑模式,其中交互式 shell的用户可以使用vi样式的快捷方式导航行。 在dash
(Ubuntu的默认shell符号链接到/bin/sh
)中,这不起作用,即使man page指定此function可用。
示例:
$ dash $ set -o vi $ hello wolrd^[I
应该发生的事情是,使用Esc , Shift + i快捷方式,光标应该跳到行的开头。 如您所见,我得到一个控制字符作为输出。 我已经让一些用户在AskUbuntu Chat中测试了这个,他们确认了同样的行为。
注意,这与终端仿真器无关 – 我在3个不同的测试中测试了它:xterm,gnome-terminal和terminator。 我已经用其他shell, bash
, mksh
和ksh93
– 所有这些都按预期正常工作,所以这只是一个问题。
我很好奇,所以我从上游DASH下载源代码tarball并提取源文件。 我检查了一个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
因此,看起来libedit库用于提供行编辑function,但在构建源时这不是默认值。 我还发现这个对set -o vi上的邮件列表消息的响应不起作用:
我认为这需要使用libedit支持来构建破折号。
我检查了哪些库链接到我的Ubuntu服务器上的dash
可执行文件,并注意到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
包时,他们会省略这个可选配置,因为他们不希望sh
对其他库有外部依赖。 他们可能静态链接库,但使用dash
作为sh
主要原因是尽可能保持shell尽可能小,以便启动脚本快速运行。
编辑 :我刚搜索了“libedit dash” ,最高的结果是在这个网站上的一个非常相似的问题,由muru很好地回答。
使用行编辑支持构建Dash
对于那些可能感兴趣的人来说,这些是从源代码构建所需的步骤。
-
下载最新的源代码tarball:
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
-
validationtarball的真实性:
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
库的开发版本,否则这将会安静地失败。 如果配置脚本更加冗长地抱怨它会更好,因为它没有找到所需的文件是不明显的。sudo apt-get install libedit-dev ./configure --with-libedit
-
构建程序并(可选)将其安装到
/usr/local/bin
:make sudo make install