在shell中,箭头键,Home键,End键和tab键不能正常工作。

我在虚拟机上安装了Ubuntu迷你版(mini.iso)。然后我使用恢复模式以root身份登录,并使用useradd -m admin创建了一个帐户,然后使用passwd admin设置了密码。
当我登录新帐户时,不是正常的提示符,而只看到一个$符号。如果我尝试使用Tab键补全命令或文件名,它会打印出正常的制表符。如果我尝试使用箭头键,它会打印出^[[A^[[B^[[C^[[D。此外,ls命令不再显示颜色。
这些问题在恢复模式下都没有出现。我该如何解决这个问题?

1$ 提示符是给用户使用的。root 的提示符是 #。在终端中,箭头键不起作用,你需要输入类似 unity 这样的内容来运行 Unity shell。 - SimplySimon
3@SimplySimon 上下箭头键应该用来切换到先前的命令,左右箭头键应该用来滚动当前命令,而Tab键应该完成命令或文件名。路径应该写在$符号的左边... - user145166
非常正确,他们当然会。对不起。 - SimplySimon
1sudo chsh -s /bin/bash root 对我来说有效。 - Raskul
9个回答

这可能意味着新用户账户是以/bin/sh作为登录shell创建的(默认情况下符号链接到dash shell),而不是/bin/bash - 你可以使用'chsh'命令更改用户的登录shell。
chsh -s /bin/bash

或者更改另一个用户的登录 shell(显然需要以 root 身份执行此操作)
sudo chsh -s /bin/bash <username>

(您需要启动新的登录会话才能使更改生效)。您可能还需要将默认的.bashrc从/etc/skel复制到以获取诸如彩色提示符和默认LS_COLORS之类的内容。
将来,您可能希望使用'adduser'命令而不是'useradd'命令-它设置了一个更完整的用户环境,包括默认的.profile和.bashrc-以及将登录shell设置为'bash'。

19额外提示:用户可以在不需要sudo权限的情况下更改自己的帐户(只需在上述命令中省略“sudo”即可)。 - Cedric Reichenbach
9其实,你不需要注销。只需在提示符处键入/bin/bash来调用它。如果你修改了bash.rc文件,同样的方法也适用。要查看更改,你可以执行相同的操作。 - SDsolar
ls命令中的颜色还没有恢复。 - User1986
1@User1986 你的用户主目录下有默认的 ~/.bashrc 文件吗?你可以从 /etc/skel/ 目录中复制它。 - steeldriver
谢谢!问题已解决。顺便说一下,你在9年前回答了这个问题,并在我评论后的22秒内回复了。令人印象深刻! - User1986
@User1986 不客气 - 还有感谢你提醒我关于ls命令的颜色问题,我已经编辑了答案并提到了这一点。 - steeldriver

我在通过VNC连接到无头XFCE4时无法使用标签补全。这里列出的答案不起作用,但是以下方法有效:
编辑xml文件中的键盘快捷键:
sudo nano ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml

找到:
<property name="&lt;Super&gt;Tab" type="string" value="switch_window_key"/>

改成这样:
<property name="&lt;Super&gt;Tab" type="empty"/>

注销/重新启动,然后就可以了。

我刚刚安装了Vim,一切问题都解决了。起初,我以为它是在原始版本的Ubuntu上安装的,因为我能够使用Vi命令,但事实并非如此。
sudo apt-get install vim 

解决了问题。


1选定的答案对我没有起作用,但这个方法有效。 - Aaron Cicali
2这个回答完全与问题无关。它如何解决问题呢? - trolzen

sudo sh -c "if [ -e $(which bash) ]; then rm $(which sh) && ln -s $(which bash) /bin/sh; fi"

我的问题是/bin/sh被符号链接到/bin/dash

如果您尝试在命令的选项补全中使用错误(或缺失)的后缀来补全文件名,也会遇到选项补全失败的情况。
举个例子,对于命令+文件: totem ~/Videos/SomefilenameWithNoSuffix 进行选项补全时会失败,但是在将.mkv重命名为~/Videos/SomefilenameWithNoSuffix.mkv之后,选项补全就能完美地工作了。

在我的情况下,结果是我在我的.bash-aliases文件中创建的一个名为"test"的函数。如果你仍然遇到这些错误,请检查你在.bashrc.bash_profile.bash_aliases中的自定义别名,暂时删除任何可疑的添加,并再次尝试使用bash自动补全。

如果其他一切正常,只是某些文件名自动补全尝试失败,可能是因为您没有搜索路径中的一个组成部分的目录的权限。
假设您想要查看其他用户的.bash_profile文件的列表。以下ls命令将起作用;因为sudo以所需的权限运行ls命令。
$ sudo ls -al /home/someone_else/.bash_profile    

然而,如果你尝试使用文件名自动补全,制表符自动补全没有任何作用。
$ sudo ls -al /home/someone_else/.bash_pr<tab>   # does not complete

那是因为在执行sudo之前,bash完成已经开始运行。命令也可以写成:
$ ls -al /home/someone_else/.bash_pr<tab>   

由于缺少搜索该目录的权限,命令完成无效。

为了临时使用更高权限运行,请使用 sudo 开启一个新的 shell。

$ sudo bash

现在可以运行ls命令而无需sudo前缀,并且自动补全功能正常工作。(请注意,提示符从$切换到#。)
# ls -al /home/someone_else/.bash_pr<tab>   

只要确保在任务完成后关闭Shell;这样强大的Shell是很危险的。
# exit


它适用于Linux的所有修改。 - Josef Klimuk

一些答案可以解决这个问题。 然而,为了使状态永久,我认为你应该这样做。
要检查当前终端,请在你的ssh终端上输入这个命令。
echo $TERM

如果它是“未知”或者一些奇怪的东西,你可以通过以下方式进行更改:
echo 'export TERM=linux' >> ~/.bash_profile

你也可以使用vim或其他方式检查bash_profile文件。
vim ~/.bash_profile