为什么 sudo gedit 不打开以感叹号开头的文件

dam*_*ien 5 gedit command-line

当试图打开sudo gedit /path/to/file文件名!以前面开头的文件时,例如!config.ini我无法打开文件。但是,如果我执行 sudo nautilus 然后用 gedit 打开文件,它会打开。如果文件被重命名,则config.inisudo gedit 再次起作用。有人可以向我解释一下吗。

Joh*_*ber 8

您正在将sudo gedit /path/to/file命令输入 shell(默认为 bash),但现代 shell 使用“!” 特殊用途的字符。特殊字符可以在没有特殊含义的情况下通过在它们前面加上 '\' 字符来解释。

尝试:

gksudo gedit /path/to/\!file
Run Code Online (Sandbox Code Playgroud)

代替

gksudo gedit /path/to/!file
Run Code Online (Sandbox Code Playgroud)

在现代 shell 中,您输入的命令会被记住,您可以使用“!”重新输入它们。特点。!!例如重新输入最后一个命令。正如 Uri 指出的那样,这称为事件指示符。bash 解释器还让您可以使用Ctrl+R轻松找到要重新输入的命令,但“!” 对于我们有使用'!'习惯的老前辈来说,这种机制仍然存在。反而。“!”的其他用法 包括 $! 参数及其在算术和逻辑表达式中的使用。

如果遇到此类谜团,bash 参考可能会有所帮助,因为 shell 可能非常复杂。gnu bash 手册在这里

Uri 很有帮助地提到您应该使用 gksu 或 gksudo 而不是 sudo。这里有一个解释:“gksudo nautilus”和“sudo nautilus”有什么区别?.

  • @damien History 扩展对我来说有点太疯狂了,所以我通过将 `set +H` 放在我的 `~/.bashrc` 中来禁用它。除非您真的想使用历史扩展,否则我建议您也这样做。 (2认同)

gei*_*rha 5

简单的解决方法是通过将以下行添加到您的 ~/.bashrc

set +H
Run Code Online (Sandbox Code Playgroud)

如果您从未有意使用历史扩展,则禁用它不会错过任何内容。