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唯一的问题。
在 Ubuntu 中,默认/bin/sh指向./bin/dash
我想/bin/bash用作我的系统范围的 shell 用于/bin/sh. 做这个的最好方式是什么?
我知道
sh -c 'echo $1' sh 4
Run Code Online (Sandbox Code Playgroud)
将输出4. 和
sh -c 'echo $2' sh 4 5
Run Code Online (Sandbox Code Playgroud)
将输出5.
但我无法理解第二个之后的参数如何sh传递给旁边的命令sh -c。我阅读了两者的手册页bash,dash但找不到有关这种语法的介绍。
Ubuntu中不同shell有什么区别:
$ cat /etc/shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
Run Code Online (Sandbox Code Playgroud) 删除所有/bin/sh,/bin/bash和/bin/dash。我无法安装它们,因为dpkg需要apt-get安装 shell,但没有可用的 shell。我仍然登录并且我的 Ubuntu 仍然运行。有没有办法从这种情况中恢复过来。顺便说一句,我现在没有 Live CD。