シンボリックリンクが無効なディレクトリを選択する

シンボリックリンクが無効なディレクトリを選択する

このスクリプトが間違ったシンボリックリンクを生成したい理由を説明できる人はいますか?

主な問題は次の行にあります。

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

次のエラーが発生するためです。

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

ただし、エコーメッセージによると、実際の変数/リンクは次のようになります。

/usr/lib64/libpgtypes.so

以下はスクリプトの実行結果です。

[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

スクリプトのコードは次のとおりです。#!/ 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

答え1

/usr/lib64/libpgtypes.soこれはシステムのディレクトリのようです。 (これが正しいか間違っているかは申し上げません。)


しかし、良いコーディング習慣として、すべての変数に二重引用符を使用することをお勧めします。

代わりにをln -s ${src}/${lib} ${dest64}/${lib}作成する必要があります。これにより、ループを正しくln -s "${src}/${lib}" "${dest64}/${lib}"処理することもできます。 (代わりに参考にしてください)forfor lib in "${libraries[@]}"; do ... done@*

答え2

-hdestがシンボリックリンクであることを確認するために使用されます。たとえば、次を使用して他のすべてのタイプを削除できます。

if ! [ -h "${dest}/${lib}" ]; then
    rm -rf "${dest}/${lib}"
fi

答え3

/usr/lib64/libpgtypes.soパスにディレクトリが必要です。エラーを回避するには、削除または名前を変更してスクリプトを再実行してください。

関連情報