在 find -exec 调用中执行用户定义的函数并根据参数选择该函数的版本

在 find -exec 调用中执行用户定义的函数并根据参数选择该函数的版本

这是我的起点:shell 脚本 -在find -exec调用中执行用户定义的函数 - 智库101 - 一个基于CC版权的问答分享平台

但我需要根据传递给包含脚本的参数在该函数的两个不同版本之间进行选择。我有一个工作版本,但它有很多重复的代码。我正在尝试更好地实现它,但我不太清楚如何在这种情况下做到这一点。

这是核心代码:

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

我认为我不应该有两个独立的功能。只有几行不同。实际的函数有更多的代码,但它们之间完全重复。

我没有包含用于解析参数的代码,因为我正在学习获取选择并且还没有完成那部分。

答案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' {}' \;

相关内容