Bash 有可执行文件的缓存吗?

akr*_*ki1 6 linux bash cache

我只是在我的 Ubuntu 14.10 计算机上编写 C++ 程序。由于它是一个客户端/服务器程序,我打开了三个终端模拟器:一个用于编写代码和编译,一个用于客户端测试,最后一个用于服务器测试。过了一会儿,我以为我的代码中有错误。我花了一个多小时来跟踪它,结果发现退出目录并再次进入它解决了整个问题。准确地说,这些是我执行的命令:

some_directory$ ./client
some_directory$ cd ..
$ cd some_directory
some_directory$ ./client
Run Code Online (Sandbox Code Playgroud)

没有改变任何东西——也没有重新编译——两次运行给出了不同的结果。我唯一能想到的是某种可以存储旧版本文件的缓存,但我从未听说过这样的功能。有没有解释,如何解决(让它自动刷新,不退出目录)?

Joh*_*'M. 4

我不认为 bash 做了任何花哨的事情(它确实缓存了没有路径指定的可执行文件的路径,但这并不适用于此,因为您正在指定路径)

听起来您所在的目录已被移动或安装。在构建软件的情况下,目录移动的可能性更大。

目录移动案例

在终端 1 中重新创建目录移动行为的示例

cd /tmp
mkdir dir1
cd dir1
touch exampleFile
Run Code Online (Sandbox Code Playgroud)

然后在 2 号航站楼:

cd /tmp
mv dir1 dir2
mkdir dir1
cd dir1
Run Code Online (Sandbox Code Playgroud)

两个 shell 都显示位于名为“dir1”的目录中,但列表将显示不同的内容。如果terminal2创建一个名为“exampleFile”的文件,两个shell都会在“dir1”中显示“exampleFile”,但它们是不同的文件。这是因为终端 1 中的 shell 现在实际上位于 dir2 中,只是它不知道而已。终端 1 中的 shell 可以通过 cd 到达真正的“dir1”:

cd .
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,但重新解析了路径。

上方安装盒

当 shell(或任何程序)位于目录中,然后在其之上安装文件系统时,就会发生这种情况。例如,在 1 号航站楼:

mkdir /tmp/dir1
cd /tmp/dir1
Run Code Online (Sandbox Code Playgroud)

2 号航站楼:

mount /dev/whateverdev /tmp/dir1
cd /tmp/dir1
Run Code Online (Sandbox Code Playgroud)

终端 1 在该目录中查看原始文件系统中的文件。终端 2 可以看到 /dev/whateverdev 中的文件。

如何避免

在过度安装的情况下,这主要是了解您在做什么或您的计算机是如何配置的(例如,插入 USB 驱动器时自动安装程序是否正在运行)。

在目录移动的情况下,这更多地取决于构建系统。如果有一条规则通过移动旧输出目录来备份它,然后为新构建创建一个新目录,那么您会经常遇到这种情况。检查你的构建规则是否存在欺骗行为。

当然,这也可能是一次性的无意事故(类似于上面第一个示例中所示的情况)。在这种情况下,意识到这种情况可能发生将会帮助你解决这个问题。