これが私の出発点です:シェルスクリプト -find -exec呼び出しでカスタム関数を実行する - Think Tank 101 - CC copyrightベースのQ&A共有プラットフォーム
ただし、インクルードスクリプトに渡されたパラメータに基づいて、この関数の2つの異なるバージョンから選択する必要があります。動作するバージョンがありますが、重複したコードがたくさんあります。より良い実装を試していますが、この場合はどうすればよいかわかりません。
コアコードは次のとおりです。
cmd_force() {
git fetch;
git reset --hard HEAD;
git merge '@{u}:HEAD';
newpkg=$(makepkg --packagelist);
makepkg -Ccr;
repoctl add -m $newpkg;
}
cmd_nice() {
git pull;
newpkg=$(makepkg --packagelist);
makepkg -Ccr;
repoctl add -m $newpkg;
}
if [[ $force == "y" ]] ; then
export -f cmd_force
find . -mindepth 2 -maxdepth 2 -name PKGBUILD -execdir bash -c 'cmd_force' bash {} \;
else
echo "Call this with the -f option in case of: error: Your local changes to ... files would be overwritten by merge"
export -f cmd_nice
find . -mindepth 2 -maxdepth 2 -name PKGBUILD -execdir bash -c 'cmd_nice' bash {} \;
fi
私は2つの別々の機能を持たなければならないとは思わない。数行だけ違います。実際の関数にはより多くのコードがありますが、完全に冗長です。
私は学んでいるので、パラメータを解析するコードは含まれていません。選択項目のインポートそしてその部分はまだ終わっていません。
答え1
force
また、それをエクスポートして関数if [[ $force == "y" ]]
に移動することもできます。
cmd() {
if [[ $force == "y" ]] ; then
git fetch;
git reset --hard HEAD;
git merge '@{u}:HEAD';
else
git pull;
fi
newpkg=$(makepkg --packagelist);
makepkg -Ccr;
repoctl add -m $newpkg;
}
export -f cmd
export force
find . -mindepth 2 -maxdepth 2 -name PKGBUILD -execdir bash -c 'cmd' bash {} \;
答え2
関数名を引数として使用できます。
if [[ $force == "y" ]] ; then
USE=cmd_force
else
echo "Call this with the -f option in case of: error: Your local changes to ... files would be overwritten by merge"
USE=cmd_nice
fi
export -f $USE
find . -mindepth 2 -maxdepth 2 -name PKGBUILD -execdir bash -c $USE' {}' \;