ln fornece resultados diferentes quando executado várias vezes

4

Eu tenho este script simples para usar com o sétimo sentido (é um leitor / leitor de gamebook de lobo solitário):

#!/bin/bash
GAME_PATH=$(dirname "$(readlink -f "$0")")
SEVENTH_SENSE_PATH=$(echo ~)"/.wine/drive_c/users/"$(whoami)"/Documents"
mkdir -p $SEVENTH_SENSE_PATH
ln -s -f "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"
cd "$GAME_PATH/Lone Wolf"
wine Lone\ Wolf.exe

É muito simples, movendo apenas um diretório dentro da pasta para o local que este programa do Windows espera no diretório wine - mas esse não é o problema.

ln aqui funciona na primeira vez (cria um link simbólico para books chamado Seventh Sense dentro da pasta Documents do usuário do vinho. O problema é que, na segunda vez, ele cria um link books dentro a pasta para a qual o link Seventh Sense aponta (ironicamente, exatamente a pasta original books ), quando executada duas vezes.

Não causa nenhum dano, mas parece um erro óbvio que está me escapando.

( books é uma pasta (dentro da pasta Lone Wolf que está no mesmo nível do script)).

    
por i30817 25.07.2011 / 16:41

2 respostas

1

ln , como cp e mv , se comporta de maneira diferente, dependendo se o destino é um diretório existente (incluindo um link simbólico para um). Se não for, então a fonte é copiada / movida / vinculada ao nome de desintegração. Se o destino for um diretório existente, a origem será copiada / movida / vinculada a um arquivo com o mesmo nome base da origem, no diretório de destino.

Com GNU ln (como encontrado no Linux), use a opção -n para sobrescrever o destino em vez de escrever sob ele quando o destino for um link simbólico para um diretório.

ln -snf "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"

Como alternativa, você pode testar se o destino é um diretório e não recriá-lo, se existir.

[ -d "$SEVENTH_SENSE_PATH/Seventh Sense"/. ] ||
ln -s "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"

Como alternativa, você pode remover o alvo primeiro e criá-lo incondicionalmente.

rm -f "$SEVENTH_SENSE_PATH/Seventh Sense"
ln -s "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"
    
por 25.07.2011 / 19:53
0

Isso acontece porque, na segunda vez que você executa seu script, o link existe e aponta para um diretório. Por isso, coloca o novo link dentro desse diretório. Você pode usar algo assim:

if test -e "$SEVENTH_SENSE_PATH/Seventh Sense"
then
 echo " link already exists"
else 
 ln -s -f "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"
fi;
    
por 25.07.2011 / 18:08