符号链接选择了错误的目录

符号链接选择了错误的目录

谁能解释为什么这个脚本试图创建错误的符号链接?

主要问题在于该行:

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该路径中应该有目录。请删除或重命名它并再次执行脚本以避免错误。

相关内容