我刚刚通过 Hostinger.com 设置了一个 VPS。操作系统是Ubuntu 18.04。我创建了一个用户帐户,迈克。我很快意识到自动完成功能显然没有安装,所以查看了你是如何做到这一点的。由于某种原因(shell 的类型?),我必须使用点来获取来源,而不是使用单词source
。
以迈克身份登录,我这样做了:
sudo apt-get install bash-completion
(注意试图解决我后来尝试过的问题sudo apt-get install --reinstall bash-completion
)
...我将这一行添加到 /home/mike/.bashrc 中:
. /etc/bash_completion
事实上这个文件由一行组成:
. /usr/share/bash-completion/bash_completion
目前的情况是,当我以 root 身份登录时,我可以通过执行以下操作来获得自动完成功能:
$ . /home/mike/.bashrc
但是当以 Mike 身份登录时,相同的命令给出:
$ . /home/mike/.bashrc
-su: 26: /usr/share/bash-completion/bash_completion: Syntax error: "(" unexpected
在寻找答案时,我猜测问题可能是由别名冲突引起的。但现在以 mike 身份登录时没有别名,但问题仍然存在。
我正在尝试(除其他外)理解“-su: 26”的实际含义。这似乎是一个线路参考。但该文件的第 26 行实际上是空白的。
我现在想做的是浏览 /usr/share/bash-completion/bash_completion,注释掉行,直到事情开始有意义。但它是一个大文件!
显然,其中一个令人好奇的方面是,当我以 root 身份登录时它可以工作,但当我以 mike 身份登录时则不能。
之后
我scp
将本地计算机中的 bash_completion 文件复制到 VPS 并用它来替换现有的文件(首先将后者重命名)。再次强调,当 root 工作正常时进行采购。同样,以 Mike 身份登录时进行采购会产生(几个)错误:
$ . /home/mike/.bashrc
-su: 29: /usr/share/bash-completion/bash_completion: [[: not found
-su: 35: /usr/share/bash-completion/bash_completion: [[: not found
-su: 51: /usr/share/bash-completion/bash_completion: shopt: not found
-su: 57: /usr/share/bash-completion/bash_completion: complete: not found
-su: 62: /usr/share/bash-completion/bash_completion: complete: not found
[... more... ]
有什么建议么?是否可能是由于某种原因,迈克帐户使用了不同的 shell?不同的 shell 语法?我该如何检查这种事情?
答案1
(以 root 身份登录:)
root@vps46990199:~# getent passwd mike
mike:x:1000:1000::/home/mike:/bin/sh
root@vps46990199:~# getent passwd root
root:x:0:0:root:/root:/bin/bash
...稍微搜索一下就能找到答案:
root@vps46990199:~# usermod -s /bin/bash mike
...问题解决了(感谢 ender.qa)
更多信息
阅读周围,我首先验证它实际上/bin/sh
不是一个文件,而是一个符号链接。根据现代版本的 Ubuntu 这曾是(在我跑之前usermod
)链接到/bin/dash
,我读到:
bash 是事实上的标准(非常广泛使用),但它不是“标准”; Ubuntu 上的 sh 使用 dash,这是一个兼容 Posix 的 shell,所以它确实是标准的。我的建议是在脚本编写中尽可能多地使用破折号,尤其是服务器端脚本。尽管 bash 更具表现力,但 dash 运行速度更快且更安全(这里,Rick-777 的评论)
这让您想知道为什么 Hostinger.com 的root
帐户使用bash
而不是dash
作为标准帐户,就像默认创建的用户帐户一样。超出了我的工资水平。