2016-11-15 20 views
3

我有一個bash腳本,旨在冪等。它創建符號鏈接,如果鏈接已經存在,應該可以。這個bash -e和-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一個符號,根據ls -l

然而,當我運行此腳本ifelif分支進入,相反,我們進入else並嘗試ln,這將失敗,因爲該文件已經存在。

爲什麼我的測試不起作用?

+0

您可以創建可在臨時目錄中運行一個實例(甚至是使用'mktemp的-d'上創建自己的目錄),因此人們可以複製/粘貼,並無需改變運行這些名字還是擁有root權限? –

+0

另外:'/ other/place'是否存在?如果它應該,請確保您的示例實際上創建它(當然,在您的臨時目錄下)。 –

+1

...另外,如果'-e'爲真,爲什麼只檢查'-L'? –

回答

3

因爲你只檢查[ -L "$L" ]如果[ -e "$L" ]是真實的,[ -e "$L" ]返回false爲指向一個不存在的目的地的鏈接,你沒有發現指向不存在位置的鏈接。

下面的邏輯更全面一些。

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