find -exec 呼び出しでユーザー定義関数を実行し、引数に基づいて関数バージョンを選択します。

find -exec 呼び出しでユーザー定義関数を実行し、引数に基づいて関数バージョンを選択します。

これが私の出発点です:シェルスクリプト -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' {}' \;

関連情報