find -exec 호출에서 사용자 정의 함수를 실행하고 인수를 기반으로 함수 버전을 선택합니다.

find -exec 호출에서 사용자 정의 함수를 실행하고 인수를 기반으로 함수 버전을 선택합니다.

이것이 나의 출발점입니다: 쉘 스크립트 -find -exec 호출에서 사용자 정의 함수 실행 - Think Tank 101 - CC copyright 기반 Q&A 공유 플랫폼

하지만 포함 스크립트에 전달된 매개 변수를 기반으로 이 함수의 두 가지 다른 버전 중에서 선택해야 합니다. 작동하는 버전이 있지만 중복된 코드가 많이 있습니다. 더 나은 구현을 시도하고 있지만 이 경우에는 어떻게 해야 할지 잘 모르겠습니다.

핵심 코드는 다음과 같습니다.

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

관련 정보