是否可以使用 find -exec 保留环境变量?我没有看到任何使用 FreeBSD 版本的 find 的选项。如果绝对需要,我可以切换到 for 循环,但希望使用 exec 的简洁性以及速度更快。
我能想到的另一个选项并不漂亮,那就是转储环境,然后在我正在执行的命令中将其读回。
编辑:
find . -type f -name '*/*.patch/go' -exec go install {} \;
在这个例子中,我想使用http代理。我已经有代码告诉 git 配置全局 http 代理(上面)。
所以,从下面的例子来看,我需要用 sh? 作为前缀。为什么?
答案1
子进程总是继承环境。这意味着您启动的实用程序find ... -exec
将有权访问该环境。
测试这个:
$ unset -v myvar1 myvar2
$ export myvar1='hello world'
$ myvar2='not exported'
$ find . -exec sh -c 'for pathname do printf "found %s, myvar1=%s, myvar2=%s\n" "$pathname" "$myvar1" "$myvar2"; done' sh {} +
found ., myvar1=hello world, myvar2=
found ./.bash_profile, myvar1=hello world, myvar2=
found ./.bashrc, myvar1=hello world, myvar2=
found ./.yashrc, myvar1=hello world, myvar2=
found ./.zshrc, myvar1=hello world, myvar2=
在这里,我清除了两个 shell 变量myvar1
和myvar2
,然后设置它们并导出,myvar1
但没有myvar2
。这意味着myvar1
可以被任何子进程继承,而myvar2
不会被继承。
正如您在 的输出中看到的find
,导出的内容myvar1
在单引号脚本中可用,sh -c
该脚本find
调用-exec
批量找到的路径名。
您还可以在命令前面使用赋值find
来设置环境变量的值,而无需在当前 shell 中进行设置。这是标准语法,而不仅仅是find
工作原理。
$ unset -v myvar1 myvar2
$ myvar2='now in environment' find . -exec sh -c 'for pathname do printf "found %s, myvar1=%s, myvar2=%s\n" "$pathname" "$myvar1" "$myvar2"; done' sh {} +
found ., myvar1=, myvar2=now in environment
found ./.bash_profile, myvar1=, myvar2=now in environment
found ./.bashrc, myvar1=, myvar2=now in environment
found ./.yashrc, myvar1=, myvar2=now in environment
found ./.zshrc, myvar1=, myvar2=now in environment
不使用此语法的另一个示例find
:
$ unset -v x
$ x='hello there' sh -c 'printf "%s\n" "$x"'
hello there
$ printf "%s\n" "$x"
请注意当前 shell 中未设置的方式x
(最后printf
输出空行)。