Shell-Script

如果沒有指定“*”,為什麼記憶體目錄會被刪除?

  • August 25, 2021

我將 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 nullglobunsetopt 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全部取決於您使用該功能的方式…

-frm我們檢查是否存在時被移除。

引用自:https://unix.stackexchange.com/questions/665990