我想有一个环境变量或一些我不知道的设置,但这让我发疯。
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
可以解释行为的差异。