Shell-Script
如果沒有指定“*”,為什麼記憶體目錄會被刪除?
我將 ZSH 作為我的預設 shell,並在其上使用 OhMyZsh。有時我需要刪除一些文件並重置一些權限/所有權,所以我正在使用它的別名。假設我在
/home/parallels/Development/prj1
. 有了下面的腳本,我會在它工作時執行它,fixperms prj1
但是….
- 如果我執行一次腳本並刪除了內容,
$CURRENT_PROJECT/$PROJECT_CACHE
我最終會出現以下錯誤:fixperms:4: no matches found: /home/parallels/Development/prj1/framework/var/cache/*
- 如果我在它
*
的末尾$CURRENT_PROJECT/$PROJECT_CACHE/*
刪除它會刪除cache
我不想要的文件夾- 該文件
dev.log
永遠不會被刪除我在這裡缺少什麼?
PROJECT=framework PROJECT_VAR=$PROJECT/var PROJECT_CACHE=$PROJECT_VAR/cache PROJECT_LOG=var/log/dev.log fixperms () { if [ -n "$1" ]; then CURRENT_PROJECT=$HOME/Development/"$1" cd $CURRENT_PROJECT && sudo rm -rf $CURRENT_PROJECT/$PROJECT_CACHE/* && sudo rm -rf $CURRENT_PROJECT/$PROJECT_LOG && sudo chown -R "$(whoami)":root $CURRENT_PROJECT && sudo chmod -R 777 $CURRENT_PROJECT/$PROJECT_VAR else echo "Missing project param." fi }
注意:我不是 bash/shell 腳本專家,因此任何改進都非常受歡迎並提前感謝
當您將所有操作連結在一起
&&
時,如果一個操作失敗,它將中斷 - 並且在那之後的任何操作都不會被執行。不確定這是不是有意的。嘗試例如:
echo A && false && echo B echo A && true && echo B
因此,為什麼在項目記憶體失敗
dev.log
時永遠不會刪除。rm
在那一行之後rm -rf $CURRENT_PROJECT/$PROJECT_CACHE/*
,沒有任何內容被執行。
zsh``nullglob
預設情況下關閉,因此為什麼會*
失敗。無論如何;
您可以先檢查目錄是否為空,然後
rm
. 更容易的是簡單地刪除它並重新創建它。可選的一個可以
setopt nullglob
和unsetopt nullglob
之後。其他注意事項:
您是否有理由使用大寫變數,但最好盡可能避免使用它。它可能會因環境變數、內置函式等而崩潰。
你應該引用更多。
我假設
$project_log
是一個文件,如果-r
是這樣就沒用了。
echo
/printf
錯誤到stderr
.project=framework project_var=$project/var project_cache=$project_var/cache project_log=var/log/dev.log fixperms () { if [ -n "$1" ]; then current_project="$HOME/Development/$1" # Change to project directory. Exit if it fails. # The shell should give descriptive error. pushd "$current_project" || exit 1 [ -e "./$project_cache/" ] && sudo rm -r "./$project_cache/" sudo mkdir "./$project_cache" [ -e "./$project_log" ] && sudo rm "./$project_log" sudo chown -R "$(whoami):root" . sudo chmod -R 777 "./$project_var" # Restore directory we started from popd else printf 'fixperms(): Missing argument: project\n' >&2 fi }
您可能想要
return 1
而不是exit 1
全部取決於您使用該功能的方式…
-f
在rm
我們檢查是否存在時被移除。