Linux

在 find -exec 呼叫中執行使用者定義的函式並根據參數選擇該函式的版本

  • October 14, 2020

這是我的起點:shell 腳本 -在 find -exec 呼叫中執行使用者定義的函式

但我需要根據傳遞給包含腳本的參數在 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

我不認為我應該有兩個獨立的功能。只有幾行不同。實際的函式有更多的程式碼,但它們之間是完全重複的。

我沒有包含用於解析參數的程式碼,因為我正在學習getopt並且還沒有完成那部分。

您也可以導出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 {} \;

您可以使用函式名稱作為參數:

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

引用自:https://unix.stackexchange.com/questions/614428