maz*_*zda 5 debian bash tab-completion
如果我在根终端中su
,那么一切都很好:完成在任何地方都可以。
如果作为普通用户,我尝试使用sudo
访问/root/
目录,例如,如果我想打开/root/.selected_editor
.
当我达到 /ro 完成时,它仍然正常并写入/root/
,但随后它停止工作。如果我写完想要手动执行的 Linux Bash 命令,那么这个命令就可以正常工作。
root@Xfce:~# cat .se(lected_editor) ---> completion is OK
xxx@Xfce:~$ sudo cat /ro(ot/) ---> completion is still OK
xxx@Xfce:~$ sudo cat /root/.se( ) ---> completion has stopped working
Run Code Online (Sandbox Code Playgroud)
为了看看我是否可以列出里面的内容/root/
,我尝试了 sudo ls -a /root/
,并且我得到了正确的列表。然后我在另一台安装了 Debian 11 的笔记本电脑上尝试,它的行为完全一样。
系统:配备Debian 11 (Bullseye) 和Xfce 的笔记本电脑
use*_*686 22
文件名的制表符补全不是通过要求“sudo cat”提供建议来完成的;它是由您当前正在输入命令的 shell 直接完成的。由于它尚未在“sudo”下运行,因此它没有访问 的内容的权限/root
,就像 als /root
或echo /root/*
不会一样。
请始终记住,这sudo
不仅仅是一个特殊的 shell 关键字告诉它以 root 身份执行操作。它是一个完整的独立程序,需要以相同的方式运行ps
或以其他方式运行。(例如,运行sudo cat something
只会使 shell 运行 /bin/sudo;然后 sudo 获得 root 权限并运行实际的 /bin/cat。)
因此,它的效果仅在命令运行时可见,并且只能影响提供给 sudo 的命令行部分。它看不到“sudo this | that”中管道的其余部分(由 shell 分割),它不会影响文件重定向(这些重定向是在“sudo”运行之前由 shell 完成的),并且它可以不影响制表符完成(也由 shell 在启动“sudo”之前完成)。
(虽然对于某些命令,Bash 可能有自定义的“bash-completion”脚本,这些脚本可能会选择通过 sudo 运行一些帮助程序来获取文件或服务或进程的列表,但本示例中未使用此类脚本.您只处理 Bash 的内置文件名完成。)