我在 bash 腳本中遇到過這個問題:
if { set -C; 2>/dev/null >~/test.lock; }; then
echo "Acquired lock"
else
echo "Lock file exists… exiting"
exit 1
fi
它進入 else 流。我知道 set -C 不會覆寫檔案,2>/dev/null 的意思是:將錯誤重定向到“void”,但是我有 >~/test.lock 并且意味著重定向鎖定檔案中的某些內容,(究竟是什么,錯誤可能)。我有 test.lock 在家中創建的檔案,并為空。作為 if ,在我的情況下它必須回傳 false 。
uj5u.com熱心網友回復:
{ ... ; ... ; }是一個復合命令。那就是 bash 執行其中的每個命令,退出代碼是最后一個。它有點像( ... ; ... ),除了(你執行一個效率較低的子shell(有點像sh -c "... ; ..."),而且,例如,防止影響當前 shell 的區域變數。
所以,簡而言之,{ set -C; 2>/dev/null >~/test.lock; }意思是“做set -C,然后做2>/dev/null >~/test.lock,回傳(退出代碼)是最后一個命令之一”。
if { set -C; 2>/dev/null >~/test.lock; }“如果2>/dev/null >~/test.lock在該復合命令中成功,則在之后”也是如此set -C。
現在,set -C意味著您無法覆寫現有檔案
如果存在2>/dev/null > ~/test.lock則嘗試覆寫test.lock,如果不存在則嘗試創建它。
所以,你在這里擁有的是
- 如果鎖定檔案已經存在,失敗并說“鎖定檔案存在,正在退出”
- 如果鎖定檔案沒有退出,創建它,并說“鎖定獲得”。
它在一次操作中完成。所以它不同于
# Illustration of how NOT to do it. Do not use this code :-)
if [[ -f "test.lock" ]]
then
echo "lock file exists, exiting"
else
2>/dev/null > ~/test.lock
echo "lock file acquired"
fi
因為,更清楚但錯誤的是,版本并不能保證在 if 條件的評估和2>/dev/null > ~/test.lock.
您展示的版本具有鎖的創建和測驗是同一件事的優點。
uj5u.com熱心網友回復:
set -C不允許寫入現有檔案
2>/dev/null抑制警告
>~/test.lock嘗試寫入名為 test.lock 的檔案。如果檔案已經存在,則回傳錯誤,因為set -C. 否則它將創建一個新test.lock檔案,使該腳本的下一個實體在此步驟中失敗。
鎖定檔案的目的是確保只有一個腳本實體同時運行。當程式完成時,它可以洗掉~/test.lock以讓另一個實體運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515330.html
標籤:重击壳
