例如,当我尝试打开一个sudo gedit /path/to/file
文件名以 a!
开头的文件!config.ini
时,我无法打开该文件。但是,如果我使用 sudo nautilus 然后用 gedit 打开该文件,它就会打开。如果将文件重命名,config.ini
sudo gedit 再次有效。有人能给我解释一下吗?
答案1
您正在将sudo gedit /path/to/file
命令输入到 shell(默认情况下为 bash),但现代 shell 使用 '!' 字符来表示特殊用途。通过在特殊字符前加上 '\' 字符,可以解释这些特殊字符,而这些特殊字符没有特殊含义。
尝试:
gksudo gedit /path/to/\!file
代替
gksudo gedit /path/to/!file
在现代 shell 中,您输入的命令会被记住,您可以使用“!”字符重新输入它们。!!
例如,重新输入最后一个命令。正如 Uri 指出的那样,这称为事件指示符。bash 解释器还允许您使用Ctrl+R轻松找到要重新输入的命令,但对于我们这些习惯使用“!”的老用户来说,“!”机制仍然存在。“!”的其他用途包括 $!参数,以及它在算术和逻辑表达式中的使用。
如果你遇到这样的问题,bash 参考可能会有所帮助,因为 shell 可能非常复杂。gnu bash 手册是这里。
Uri 有帮助地提到您应该使用 gksu 或 gksudo 而不是 sudo。这里有一个解释:“gksudo nautilus”和“sudo nautilus”有什么区别?。
答案2
简单的解决方法是永久禁用历史记录扩展,方法是将以下行添加到您的~/.bashrc
set +H
如果您从未有意使用过历史记录扩展,则禁用它不会让您错过任何内容。
答案3
它是一个事件指示器。
看man bash
:
- ! 扩展为最近执行的后台(异步)命令的进程 ID。
答案4
完整的解决方案是将目录名称放在单引号 ( '
) 内。
例子
sudo gedit /media/alexandro/'Disco Local'/'Dropbox (Equipe Alexandro)'/Pessoal/'!A Organizar'/Documentos/'!asd.txt'