linux - 无法使用 find -exec 运行源命令

标签 linux bash find

  1. 失败
find ${settings_base} -type f -exec source {} \;
find: ‘source’: No such file or directory
  • 通过
  • for f in $(find ${settings_base} -type f); do
        source "${f}"
    done
    

    我只是想知道失败的原因。

    最佳答案

    find-exec 谓词运行一个子进程。但是 source 不能作为子进程运行。

    Shell 内置命令如 source (和 cd 等)会修改当前运行的 shell 实例的环境。它们不作为外部命令存在(没有 /bin/source/usr/bin/source 等),因为它们无法工作作为外部命令。回想一下,出于安全原因以及架构原因,子进程无法修改其父进程的环境(另请参阅 Global environment variables in a shell script 了解背景)。所以事实上,即使find能够以某种方式执行source,它也只能修改find进程的环境,然后当find 退出,任何效果都将丢失,并且当前运行的 shell 实例将回到运行 find 之前的位置。

    您已经发现的解决方法就是实现这一点的方法,但为了完全稳健性,您还必须防止 find 输出中出现空格或其他 shell 元字符。 https://mywiki.wooledge.org/BashFAQ/020有详细的讨论,但我不会在这里重复所有的细微差别和极端情况;单击进入链接页面。

    while IFS= read -r -d '' f; do
      source "$f"
    done < <(find $settings_base -type f -print0)
    

    (请注意,-print0 是 GNU 扩展,因此无法正确移植到各种非 Linux 平台。)

    根据 $settings_base 包含的内容,它可能应该用双引号引起来;如果它包含多个值,请将它们放入一个数组中并使用 "${settings_base_array[@]}"。另请参阅When to wrap quotes around a shell variable?

    关于linux - 无法使用 find -exec 运行源命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76981915/

    相关文章:

    bash - Perl eval、awk system() getline。两者都存在安全问题,一个比另一个更安全吗?为什么?

    c++ - vector 如何找到第一个和最后一个当前值

    python - 从 python(或 bash)部分并行运行外部命令

    bash - 在 bash 中,如何测试某个单词是否不在列表中?

    c++ - 在 C++ 中查找 vector 中的值

    linux - 如何在Linux中的许多文件中查找和替换IP地址

    php - curl - SPNEGO 无法找到协商机制

    linux - 为什么人们使用 tarball?

    linux - 如何以非 root 身份从自定义 webmin 模块执行命令

    linux - BACnet 错误 : object: unknown-object