シンボリックリンクターゲットが特定のパスに一致するかどうかを確認するbashスクリプトを作成しているので、一致しない場合、スクリプトはシンボリックリンクを削除します。 readlink
で試しました:
#!/bin/env bash
target_path=$HOME/Code/slate/.slate.js
if [ `readlink $HOME/.slate.js` == "$target_path" ]; then
rm -rf "$HOME/.slate.js"
fi
しかし、それは機能しません:
%source test
test:5: = not found
文字列を比較するときは、次のように二重引用符を使用する必要があります(もちろん、readlink $HOME/.slate.js
の出力は文字列です)。
[ "$(readlink $HOME/.slate.js)" = "$target_path" ]
万一に備えて $target_path
はリンクテキストと正確に一致していません。実際には(名前に関係なく)同等であることを確認できます。ただし、ハードリンクが望ましいので、その場合も確認することをお勧めします(以下を参照)。
より一般的な解決策は次のとおりです。
[ "$(readlink $HOME/.slate.js)" -ef "$target_path" ]
または、あなたの例のように:
target_path=$HOME/Code/slate/.slate.js
if [ "`readlink $HOME/.slate.js`" -ef "$target_path" ]; then
rm -rf "$HOME/.slate.js"
fi
しかし、それはすべてあなたの$HOME/.slate.js
はシンボリックリンクです。それがハードリンクである場合(可能な場合は望ましい)、それはより簡単です:
… [ "$HOME/.slate.js" -ef "$target_path" ] …
たぶん次のようなものです(それがシンボリックリンクであるかどうかを確認し、そうである場合は、リンクがターゲットと一致することを確認します。そうでない場合は、ファイルが同じかどうかを確認します-ハードリンクまたは実際には同じファイル):
… [ \( -L "$HOME/.slate.js" -a "`readlink $HOME/.slate.js`" -ef "$target_path" \) \
-o \( "$HOME/.slate.js" -ef "$target_path" \) ] …
また、ファイルが実際に同じファイル(ハードリンクではない)であるかどうかを確認する必要があります。そうでない場合は、唯一のコピーを削除します。