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 对此进行了测试bash,mksh并且ksh93- 都按预期正常工作,所以这是 -dash唯一的问题。
我对此感到好奇,因此我从上游 DASH 下载中下载了源代码 tarball并提取了源文件。我检查了一个 README 文件,该文件应该提供有关程序及其构建选项的信息,但没有 \xe2\x80\x99t 任何文件,所以我运行了./configure --help它的输出包括:
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\nRun Code Online (Sandbox Code Playgroud)\n\n因此,看起来libedit库用于提供行编辑功能,但这不是构建源代码时的默认设置。我还发现对set -o vi上的邮件列表消息的响应不起作用:
\n\n\n\n\n我认为这需要在 libedit 支持下构建 dash 才能工作。
\n
我检查了哪些库链接到了dash我的 Ubuntu 服务器上的可执行文件,并注意到libedit其中不包括\xe2\x80\x99:
$ 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)\nRun Code Online (Sandbox Code Playgroud)\n\n我想当 Debian 软件包维护者构建软件包时dash,他们会忽略这个可选配置,因为他们不希望sh对其他库有外部依赖。dash他们可能可以静态链接库,但使用as 的主要原因sh是使 shell 尽可能小和快,以便启动脚本快速运行。
编辑:我刚刚搜索了 \xe2\x80\x9clibedit dash\xe2\x80\x9d,最上面的结果是这个网站上的一个非常相似的问题,muru 很好地回答了。
\n\n对于那些可能感兴趣的人,这些是从源代码构建所需的步骤。
\n\n下载最新的源代码压缩包:
\n\nwget 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\nRun Code Online (Sandbox Code Playgroud)验证 tarball 的真实性:
\n\nsha256sum -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\nRun Code Online (Sandbox Code Playgroud)解压源文件并切换到源目录:
\n\ntar -xf dash-0.5.9.tar.gz\ncd dash-0.5.9\nRun Code Online (Sandbox Code Playgroud)运行./configure --with-libedit以创建 Make 文件。libedit但是,除非安装了该库的开发版本,否则这将悄悄失败。如果配置脚本更详细地抱怨会更好,因为 \xe2\x80\x99 并不明显表明它无法找到所需的文件。
sudo apt-get install libedit-dev\n./configure --with-libedit\nRun Code Online (Sandbox Code Playgroud)构建程序并(可选)将其安装到/usr/local/bin:
make\nsudo make install\nRun Code Online (Sandbox Code Playgroud)