即使提供完整路径,Bash 也会执行与提示的文件不同的文件

即使提供完整路径,Bash 也会执行与提示的文件不同的文件

我想有一个环境变量或一些我不知道的设置,但这让我发疯。

baco:~ # ls -la /root/subversion-1.4.6/subversion/svnadmin/.libs/svnadmin       
-rwxr-x---  1 root root 57263 Mar 10  2008 /root/subversion-1.4.6/subversion/svnadmin/.libs/svnadmin
baco:~ # ls -la /usr/local/subversion-1.6.1/subversion/svnadmin/.libs/svnadmin  
-rwxr-xr-x  1 root root 76125 Apr 20  2009 /usr/local/subversion-1.6.1/subversion/svnadmin/.libs/svnadmin

我在那里编译了两个版本的 svnadmin 。如果我执行一个我就会得到它

baco:~ # /usr/local/subversion-1.6.1/subversion/svnadmin/.libs/svnadmin --version
svnadmin, version 1.6.1 (r37116)
   compiled Apr 20 2009, 16:09:36

Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository back-end (FS) modules are available:

* fs_base : Module for working with a Berkeley DB repository.
* fs_fs : Module for working with a plain file (FSFS) repository.

如果我使用完整路径执行另一个,我仍然会更早得到!

baco:~ # /root/subversion-1.4.6/subversion/svnadmin/.libs/svnadmin --version
svnadmin, version 1.6.1 (r37116)
   compiled Apr 20 2009, 16:09:36

Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository back-end (FS) modules are available:

* fs_base : Module for working with a Berkeley DB repository.
* fs_fs : Module for working with a plain file (FSFS) repository.

如果我在没有路径信息的情况下运行 svnadmin,我也会得到 1.6.1 版本(正常,由于 $PATH)。通过 cron 我可以执行 1.4.6,因此这必须是交互式或登录 shell 所特有的。

编辑:

我知道 cron 正在执行 1.4.6,因为我已经/root/subversion-1.4.6/subversion/svnadmin/.libs/svnadmin --version通过 cron 运行并且获得了 1.4.6 版本的输出(具有正确的编译日期)。如果我通过 cron 运行带有完整路径的 1.6.1 版本,我确实会得到 1.6.1 的输出。

两者都是二进制文件:

baco:~ # file /root/subversion-1.4.6/subversion/svnadmin/.libs/svnadmin
/root/subversion-1.4.6/subversion/svnadmin/.libs/svnadmin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped
baco:~ # file /usr/local/subversion-1.6.1/subversion/svnadmin/.libs/svnadmin
/usr/local/subversion-1.6.1/subversion/svnadmin/.libs/svnadmin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped

它们也不是硬链接

baco:~ # stat -c %h /usr/local/subversion-1.6.1/subversion/svnadmin/.libs/svnadmin
1
baco:~ # stat -c %h /root/subversion-1.4.6/subversion/svnadmin/.libs/svnadmin   
1

答案1

看起来svnadmin二进制文件只是一层代码,它包装了一个共享库来完成实际工作(包括版本号)。事实上,如果我运行strings $(which svnadmin),版本消息不会出现在输出中,因此它不是svnadmin二进制文件的一部分。

因此,交互式会话之间 LD_LIBRARY_PATH 的差异cron可以解释行为的差异。

相关内容