破折号 ( /bin/sh ) 中的 vi 编辑模式

Ser*_*nyy 6 command-line dash-shell

TL;DR:默认的 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
Run Code Online (Sandbox Code Playgroud)

应该发生的是,使用Esc, Shift+i快捷方式光标应该跳到行的开头。如您所见,我得到了一个控制字符作为输出。我已经要求一些用户在 AskUbuntu Chat 中对此进行测试,他们确认了相同的行为。

请注意,这与终端模拟器无关 - 我在 3 个不同的模拟器中对其进行了测试:xterm、gnome-terminal 和终结器。我已经用其他 shell 对此进行了测试bashmksh并且ksh93- 都按预期正常工作,所以这是 -dash唯一的问题。

Ant*_*gan 2

我对此感到好奇,因此我从上游 DASH 下载中下载了源代码 tarball并提取了源文件。我检查了一个 README 文件,该文件应该提供有关程序及其构建选项的信息,但没有 \xe2\x80\x99t 任何文件,所以我运行了./configure --help它的输出包括:

\n\n
Optional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-libedit          Compile with libedit support\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,看起来libedit库用于提供行编辑功能,但这不是构建源代码时的默认设置。我还发现对set -o vi上的邮件列表消息的响应不起作用:

\n\n
\n

我认为这需要在 libedit 支持下构建 dash 才能工作。

\n
\n\n

我检查了哪些库链接到了dash我的 Ubuntu 服务器上的可执行文件,并注意到libedit其中不包括\xe2\x80\x99:

\n\n
$ ldd /bin/dash\n        linux-vdso.so.1 =>  (0x00007fffcfbd6000)\n        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f013a0b7000)\n        /lib64/ld-linux-x86-64.so.2 (0x00007f013a475000)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想当 Debian 软件包维护者构建软件包时dash,他们会忽略这个可选配置,因为他们不希望sh对其他库有外部依赖。dash他们可能可以静态链接库,但使用as 的主要原因sh是使 shell 尽可能小和快,以便启动脚本快速运行。

\n\n

编辑:我刚刚搜索了 \xe2\x80\x9clibedit dash\xe2\x80\x9d,最上面的结果是这个网站上的一个非常相似的问题,muru 很好地回答了。

\n\n

使用行编辑支持构建 Dash

\n\n

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

\n\n
    \n
  1. 下载最新的源代码压缩包:

    \n\n
    wget http://gondor.apana.org.au/~herbert/dash/files/dash-0.5.9.tar.gz\nwget http://gondor.apana.org.au/~herbert/dash/files/dash-0.5.9.tar.gz.sha256sum\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 验证 tarball 的真实性:

    \n\n
    sha256sum -c <( awk \'/dash/{ print $1 "  "  $3}\' dash-0.5.9.tar.gz.sha256sum )\ngpg --verify --auto-key-retrieve dash-0.5.9.tar.gz.sha256sum\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 解压源文件并切换到源目录:

    \n\n
    tar -xf dash-0.5.9.tar.gz\ncd dash-0.5.9\n
    Run Code Online (Sandbox Code Playgroud)
  6. \n
  7. 运行./configure --with-libedit以创建 Make 文件。libedit但是,除非安装了该库的开发版本,否则这将悄悄失败。如果配置脚本更详细地抱怨会更好,因为 \xe2\x80\x99 并不明显表明它无法找到所需的文件。

    \n\n
    sudo apt-get install libedit-dev\n./configure --with-libedit\n
    Run Code Online (Sandbox Code Playgroud)
  8. \n
  9. 构建程序并(可选)将其安装到/usr/local/bin

    \n\n
    make\nsudo make install\n
    Run Code Online (Sandbox Code Playgroud)
  10. \n
\n