2016-11-15 5 views
3

私は冪等級を意図したbashスクリプトを持っています。シンボリックリンクが作成されます。リンクがすでに存在する場合は、大丈夫です。なぜこのbash -eと-Lテストはこのリンクを捕捉しないのですか?

はここls -lによると、エキス

L="/var/me/foo" 
    if [[ -e "$L" ]] && ! [[ -L "$L" ]]; 
    then 
     echo "$L exists but is not a link." 
     exit 1; 
    elif [[ -e "$L" ]] && [[ -L "$L" ]]; 
    then 
     echo "$L exists and is a link." 
    else 
     ln -s "/other/place" "$L" || 
     { 
      echo "Could not chown ln -s for $L"; 
      exit 1; 
     } 
    fi 

/var/me/fooが既に/other/placeを指すシンボリックリンクであるファイルです。私はこのスクリプトを実行すると

それにもかかわらず、ifelif枝が入っないではなく、我々はelseに行くと、ファイルがすでに存在しているため、失敗しlnを試み、です。

私のテストはなぜ機能しませんか?

+0

人々は/ペーストをコピーして、変更を必要とせずに、それを実行できるようにあなたは、一時ディレクトリに実行できる例を作成する(あるいは、独自のディレクトリを作成するには、 'mktempの-d'を使用しています)でした。名前やroot特権を持っていますか? –

+0

また、 '/ other/place'は存在しますか?それが必要な場合は、実際に作成した例が実際に作成することを確認してください(もちろん、一時ディレクトリーの下に)。 –

+1

...また、 '-e'が真である場合に' -L'をチェックするのはなぜですか? –

答えて

3

[ -e "$L" ]がtrueで、存在しない宛先を指すリンクに対して[ -e "$L" ]がfalseを返した場合にのみ、[ -L "$L" ]をチェックするため、存在しない場所を指すリンクは検出されません。

以下のロジックはもう少し包括的です。

link=/var/me/foo 
dest=/other/place 
# because [[ ]] is in use, quotes are not mandatory 
if [[ -L $link ]]; then 
    echo "$link exists as a link, though its target may or may not exist" >&2 
elif [[ -e $link ]]; then 
    echo "$link exists but is not a link" >&2 
    exit 1 
else 
    ln -s "$dest" "$link" || { echo "yadda yadda" >&2; exit 1; } 
fi 
関連する問題