谁能解释为什么这个脚本试图创建错误的符号链接?
主要问题在于该行:
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
该路径中应该有目录。请删除或重命名它并再次执行脚本以避免错误。