ln 多次运行时给出不同的结果

ln 多次运行时给出不同的结果

我有这个简单的脚本可以使用第七感(这是一个独狼游戏书阅读器/玩家):

#!/bin/bash
GAME_PATH=$(dirname "$(readlink -f "$0")")
SEVENTH_SENSE_PATH=$(echo ~)"/.wine/drive_c/users/"$(whoami)"/Documents"
mkdir -p $SEVENTH_SENSE_PATH
ln -s -f "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"
cd "$GAME_PATH/Lone Wolf"
wine Lone\ Wolf.exe

这非常简单,只需将文件夹内的目录移动到该 Windows 程序在 wine 目录中期望的位置 - 但这不是问题。

ln这里第一次工作(它创建一个符号链接到wine 用户的文件夹内books命名。问题是,第二次它在符号链接指向的文件夹内创建一个符号链接(讽刺的是,正是原始文件夹),当运行时两次。Seventh SenseDocumentsbooksSeventh Sensebooks

它不会造成任何伤害,但它似乎是一个明显的错误,我却没有注意到。

(books是一个文件夹(在Lone Wolf与脚本同级的文件夹内))。

答案1

lncp和 一样mv,根据目标是否是现有目录(包括指向目录的符号链接)而表现不同。如果不是,则将源复制/移动/链接到目标名称。如果目标是现有目录,则源将被复制/移动/链接到目标目录下与源具有相同基本名称的文件。

使用 GNU ln(如 Linux 下所示),-n当目标是目录的符号链接时,使用该选项覆盖目标而不是在目标下写入。

ln -snf "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"

或者,您可以测试目标是否是目录,如果存在则不重新创建它。

[ -d "$SEVENTH_SENSE_PATH/Seventh Sense"/. ] ||
ln -s "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"

或者,您可以先删除目标,然后无条件创建它。

rm -f "$SEVENTH_SENSE_PATH/Seventh Sense"
ln -s "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"

答案2

发生这种情况是因为第二次运行脚本时,链接存在并且指向一个目录。因此它将新链接放入该目录中。你可以使用这样的东西:

if test -e "$SEVENTH_SENSE_PATH/Seventh Sense"
then
 echo " link already exists"
else 
 ln -s -f "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"
fi;

相关内容