dash 中的 vi 编辑模式(/bin/sh)

dash 中的 vi 编辑模式(/bin/sh)

总结:默认 shell 手册页显示有 vi 编辑模式,但set -o vi实际上并未启用它

在许多 shell 中,包括dashPOSIX 标准都规定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 测试过它,、bashmksh-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 尽可能小巧、快速,以便启动脚本快速运行。dashsh

编辑: 我只是搜索“libedit dash”最佳结果是这个网站上有非常相似的问题muru 对此给出了很好的回答。

构建支持行编辑的 Dash

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

  1. 下载最新的源码包:

    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. 验证 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
    
  3. 提取源文件并进入源目录:

    tar -xf dash-0.5.9.tar.gz
    cd dash-0.5.9
    
  4. 运行./configure --with-libedit以创建 Make 文件。但是,除非libedit安装了库的开发版本,否则此操作会悄悄失败。如果 configure 脚本更详细地发出抱怨会更好,因为它无法明显地找到所需的文件。

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

    make
    sudo make install
    

相关内容