短划线中的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 

应该发生的事情是,使用EscShift + i快捷方式,光标应该跳到行的开头。 如您所见,我得到一个控制字符作为输出。 我已经让一些用户在AskUbuntu Chat中测试了这个,他们确认了同样的行为。

注意,这与终端仿真器无关 – 我在3个不同的测试中测试了它:xterm,gnome-terminal和terminator。 我已经用其他shell, bashmkshksh93 – 所有这些都按预期正常工作,所以这只是一个问题。

我很好奇,所以我从上游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

对于那些可能感兴趣的人来说,这些是从源代码构建所需的步骤。

  1. 下载最新的源代码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 
  2. 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 
  3. 提取源文件并切换到源目录:

     tar -xf dash-0.5.9.tar.gz cd dash-0.5.9 
  4. 运行./configure --with-libedit以创建Make文件。 但是,除非安装了libedit库的开发版本,否则这将会安静地失败。 如果配置脚本更加冗长地抱怨它会更好,因为它没有找到所需的文件是不明显的。

     sudo apt-get install libedit-dev ./configure --with-libedit 
  5. 构建程序并(可选)将其安装到/usr/local/bin

     make sudo make install