我的主目录中有两个 .bashrc 文件

我的主目录中有两个 .bashrc 文件

我在 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*

相关内容