私はZSHをデフォルトのシェルとして使用し、その上にOhMyZshを使用します。場合によっては、一部のファイルを削除し、一部の権限/所有権をリセットする必要があるため、そのエイリアスを使用します。 PHP / Symfonyプロジェクトがあるとしましょう/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スクリプトの専門家ではないので、どんな改善にも歓迎します。
ベストアンサー1
すべてのジョブをリンクすると、&&
そのいずれかが失敗した場合はジョブが中断され、その行以降のジョブは実行されません。これが意図的なものかどうかはわかりません。
たとえば、次のようになります。
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