我在 Windows 上使用 Ubuntu,并尝试修改 .bashrc 文件以将目录添加到 PATH 变量中。我使用重定向来执行此操作,如下所示:
pwd >> ~/.bashrc
现在我的主目录中有两个 .bashrc 文件,我无法将其还原为一个。我尝试了以下方法:
mv .bashrc copy.bashrc
rm .bashrc
该mv
命令成功将它们拆分,显示ls -a
一个 .bashrc 和一个 copy.bashrc 文件,其中副本是真实文件。rm
但是,该命令不起作用,而是告诉我 .bashrc 不存在。
我考虑删除 copy.bashrc,但这样一来,我就会丢失 .bashrc 中应该有的所有内容。我还尝试了以下方法:
cat copy.bashrc > .bashrc
这只是让我回到我开始的地方,在一个目录中有两个 .bashrc 文件。
这里发生了什么?
答案1
pwd > ~/.bashrc
覆写主目录中的 .bashrc 文件。此操作不可逆,不会创建第二个 .bashrc(事实上,目录中有两个同名文件是不可能的)。
mv .bashrc copy.bashrc
移动.bashrc 到 copy.bashrc,这意味着后续的操作rm .bashrc
一定会失败——该文件已经被移走了,不再有 .bashrc 文件。
另一个令人困惑的点.bashrc
是全名文件的。因此,如果您所说的“两个 .bashrc 文件”是指您有两个文件,其名称以“.bashrc”结尾,这很奇怪,但实际上不是问题 - 启动 shell 时只会使用一个字面名称的文件和“.bashrc”。它不应该有任何前缀,因为它不是文件扩展名(扩展名无论如何大多是没有意义的,在 *nix 系统中比在 Windows 中更是如此)。
这样事情就清楚了吗?
答案2
.bashrc
因为字符串仅包含 ASCII 集中的可打印字符。如果有任何常见的不可打印字符,则会ls -a
以某种方式向您显示(我的意思是ls
在 Ubuntu 中,这通常取决于实现),因此您已经知道了。
但是这里有统一码看起来像 ASCII 的非 ASCII 字符(或可能看起来像,取决于所用的字体)。例如,以下三个字符串成对不同:
.bashrc
.bаshrc
.bashrс
Ubuntu 在任何现代 Linux 文件系统上创建具有这些名称的文件应该没有问题。您可以对其进行测试(提示:在一个空目录中,这样rm -r
以后很容易将其作为一个整体):
touch .bashrc .bаshrc .bashrс; ls -a
第一个是你所期望的。第二个使用这封信而不是 ASCII a
。第三个使用这封信而不是 ASCII c
。很明显,人们可以很容易地用这两个非 ASCII 字母来创建另一个冒名顶替者。
然后会有“不常见”的不可打印字符ls
不会显示给你。此命令(在 Bash 中)
touch $'.bas\xE2\x80\x8Ehrc'
创造了另一个冒名顶替者(从左到右标记)。对于此文件,您在输出中看到的所有字符ls -a
都是 ASCII 字符。您需要ls -a | xxd
找出名称中隐藏的内容。
因此,这是“这里发生了什么事?”的一个可能的答案。
你的第一个命令几乎不可能创建冒名顶替文件,除非
- 你从某处复制了该命令,
- 或者您的键盘设置很奇怪(但是您在超级用户上输入的字符串
.bashrc
可能会受到影响;我已经检查过它是 ASCII)。
我怀疑这个额外的文件已经存在了,只是没有被注意到。可能是因为
- 恶作剧,
- 或者一些流氓软件,
- 或者您复制、粘贴和执行的一些其他非完全 ASCII 代码。
如果您可以在 GUI 文件管理器中看到文件(暗示) 或mc
,然后使用其功能来查看/移动/删除有问题的文件。
或者,您可以构建一个只捕获这两个文件的 glob 模式,将真实文件暂时移动.bashrc
到另一个目录,然后使用该模式来引用唯一的冒名顶替者。一些想法:
ls .b?shr?
ls .*b*a*s*h*r*c*