Link simbólico pegando o diretório errado

0

Alguém pode explicar por que esse script está tentando criar o link simbólico errado?

A questão principal é com a linha:

ln -s ${src}/${lib} ${dest64}/${lib}

porque está causando o seguinte erro:

ln: creating symbolic link '/usr/lib64/libpgtypes.so/libpgtypes.so': File exists

mas com base nas mensagens de eco, a variável / link real deve ser

/usr/lib64/libpgtypes.so

Esta é a saída da execução do script:

[root@server dir]# sh myscript.sh
Symbolic link already created from /opt/rh/rh-postgresql94/root/usr/lib64/libpgtypes.so to /usr/lib/libpgtypes.so

ln -s /opt/rh/rh-postgresql94/root/usr/lib64/libpgtypes.so /usr/lib64/libpgtypes.so
ln: creating symbolic link '/usr/lib64/libpgtypes.so/libpgtypes.so': File exists
Created symbolic link from /opt/rh/rh-postgresql94/root/usr/lib64/libpgtypes.so to /usr/lib/libpgtypes.so

E este é o código no script:     #! / bin / bash

libraries=('libpgtypes.so')

src="/opt/rh/rh-postgresql94/root/usr/lib64"
dest="/usr/lib"
dest64="/usr/lib64"

for lib in ${libraries[*]}; do
    if [ -f ${dest}/${lib} ]; then
        echo "Symbolic link already created from ${src}/${lib} to ${dest}/${lib}"
    else
        ln -s ${src}/${lib} ${dest}/${lib}
        echo "Created symbolic link from ${src}/${lib} to ${dest}/${lib}"
    fi

    if [ -f ${dest64}/${lib} ]; then
        echo "Symbolic link already create from ${src}/${lib} to ${dest64}/${lib}"
    else
        echo "ln -s ${src}/${lib} ${dest64}/${lib}"
        ln -s ${src}/${lib} ${dest64}/${lib}
        echo "Created symbolic link from ${src}/${lib} to ${dest}/${lib}"
    fi
done
    
por AK47 10.05.2017 / 16:33

3 respostas

2

Parece que /usr/lib64/libpgtypes.so é um diretório em seu sistema. (Eu não posso te dizer se isso é certo ou errado.)

Por acaso, por uma boa prática de codificação, recomendo strongmente que você cite duas vezes todas as suas variáveis.

Em vez de ln -s ${src}/${lib} ${dest64}/${lib} , você deve escrever ln -s "${src}/${lib}" "${dest64}/${lib}" . Isso também permitirá que você processe corretamente o seu for loop: for lib in "${libraries[@]}"; do ... done (observe @ em vez de * )

    
por 10.05.2017 / 16:39
1

Use -h para verificar se dest é um link simbólico, por exemplo, você pode remover todos os outros tipos com:

if ! [ -h "${dest}/${lib}" ]; then
    rm -rf "${dest}/${lib}"
fi
    
por 10.05.2017 / 16:45
0

Deve haver /usr/lib64/libpgtypes.so diretório nesse caminho. Por favor, remova ou renomeie-o e execute o script novamente para evitar o erro.

    
por 10.05.2017 / 16:58

Tags