このスクリプトが間違ったシンボリックリンクを生成したい理由を説明できる人はいますか?
主な問題は次の行にあります。
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}"
処理することもできます。 (代わりに参考にしてください)for
for lib in "${libraries[@]}"; do ... done
@
*
答え2
-h
destがシンボリックリンクであることを確認するために使用されます。たとえば、次を使用して他のすべてのタイプを削除できます。
if ! [ -h "${dest}/${lib}" ]; then
rm -rf "${dest}/${lib}"
fi
答え3
/usr/lib64/libpgtypes.so
パスにディレクトリが必要です。エラーを回避するには、削除または名前を変更してスクリプトを再実行してください。