O Bash executa um arquivo diferente daquele solicitado, mesmo ao fornecer o caminho completo

6

Eu imagino que exista uma variável de ambiente ou alguma configuração que eu não conheço, mas isso está me enlouquecendo.

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

Eu tenho duas versões do svnadmin compiladas lá. Se eu executar um eu entendi

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.

Se eu executar o outro, com o caminho completo, ainda recebo o mais cedo!

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.

Se eu rodar svnadmin sem informações de caminho, eu também obtenho a versão 1.6.1 (normal, devido a $ PATH). Através do cron eu consigo executar o 1.4.6, então isso tem que ser algo específico para shells interativas ou de login.

EDITAR:

Eu sei que o cron está executando o 1.4.6 porque eu executei /root/subversion-1.4.6/subversion/svnadmin/.libs/svnadmin --version via cron e obtive a saída de uma versão 1.4.6 (com a data de compilação adequada). Se eu rodar a versão 1.6.1 com caminho completo via cron eu recebo a saída do 1.6.1.

Ambos são arquivos binários:

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

Eles não são hard links

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
    
por Vinko Vrsalovic 09.06.2011 / 11:01

1 resposta

3

Parece que o binário svnadmin é apenas uma camada de código que envolve biblioteca compartilhada para fazer o trabalho real (incluindo o número da versão). De fato, se eu executar strings $(which svnadmin) , a mensagem da versão não aparece na saída, por isso não faz parte do binário svnadmin .

Então, uma diferença no LD_LIBRARY_PATH entre o seu sessão interativa e cron poderia explicar a diferença entre comportamento.

    
por 09.06.2011 / 18:49