一直以来, ln
命令用起来都不是非常直接: 如果想要在非当前文件夹下创建软链接, 那么 ln
命令接受的第一个路径参数就不是相对当前目录而言, 而是相对目标文件 (第二个路径参数) 而言. 因此, 首先 shell 的路径自动补全功能全无用武之地, 其次还得推断相对路径, 很不方便, 一直以来, 我都是先写好一个命名为 relapwd
的 bash 脚本 (从网上抄的):
path_to=`readlink -m $1`
if [[ -z "${2}" ]]; then
path_from=`pwd`
else
path_from=`readlink -m $2`
fi
path_to=(${path_to//\// })
path_from=(${path_from//\// })
for element in $(seq 0 $((${#path_from[@]} - 1)))
do
if [[ ${path_from[$element]} == ${path_to[$element]} ]];then
path_from[$element]=""
path_to[$element]=""
else
break
fi
done
path_from=($(echo ${path_from[@]}))
if [[ -n ${path_from} ]];then
for element in $(seq 0 $((${#path_from[@]} - 1)))
do
path_from[$element]="../"
done
else
path_from[0]="./"
fi
ddd=$(echo ${path_from[@]})
kkk=$(echo ${path_to[@]})
new_path=${ddd// /}${kkk// //}
echo $new_path
然后再调用它:
output_dir_i=`dirname $output`
input_relative=`relapwd $input $output_dir_i`
ln -s $input_relative $output
总之就是非常麻烦
但是, 自从 bash 中的 ln
的 2018 更新以来:
ln 添加了一个参数 -r
...
-r, --relative
create symbolic links relative to link location
...
SEE ALSO
link(2), symlink(2)
Full documentation at: <https://www.gnu.org/software/coreutils/ln>
or available locally via: info '(coreutils) ln invocation'
GNU coreutils 8.30 July 2018
从此, 可以直接使用 ln -sr $input $output
对任意两个路径成功创建软链接了! 喜大普奔!