有没有办法找到执行我在shell中定义的函数?

例如:

dosomething () {
  echo "Doing something with $1"
}
find . -exec dosomething {} \;

其结果是:

find: dosomething: No such file or directory

有没有办法让find's -exec看到做某事?


当前回答

我会完全避免使用-exec。使用xargs:

find . -name <script/command you're searching for> | xargs bash -c

其他回答

不直接,不。Find在一个单独的进程中执行,而不是在您的shell中执行。

创建一个shell脚本,完成与函数相同的工作,并找到can -exec。

我会完全避免使用-exec。使用xargs:

find . -name <script/command you're searching for> | xargs bash -c

让脚本调用自身,将找到的每个项作为参数传递:

#!/bin/bash

if [ ! $1 == "" ] ; then
   echo "doing something with $1"
   exit 0
fi

find . -exec $0 {} \;

exit 0

当您单独运行脚本时,它会找到您正在寻找的内容,并调用自己,将每个查找结果作为参数传递。当脚本使用参数运行时,它会执行参数上的命令,然后退出。

以这种方式执行函数是不可能的。

为了克服这个问题,你可以把你的函数放在一个shell脚本中,然后从find调用它

# dosomething.sh
dosomething () {
  echo "doing something with $1"
}
dosomething $1

现在在find as中使用它:

find . -exec dosomething.sh {} \;

因为只有shell知道如何运行shell函数,所以必须运行shell才能运行函数。你还需要用export -f标记你的export函数,否则子shell不会继承它们:

export -f dosomething
find . -exec bash -c 'dosomething "$0"' {} \;