bash:在find的exec中设置环境变量

时间:2011-04-17 09:55:50

标签: bash find environment-variables env

我想找到当前工作目录及其子目录中的所有目录,它们是git存储库的根目录,或者根本不被git跟踪。

为此,我编写了这个bash脚本:

#!/bin/bash
export FOUND_UNTRACKED=0
export FOUND_TRACKED=
find . -type d \( \( -exec test -d {}\.git \; -exec /bin/bash -c "export FOUND_TRACKED=$1:$FOUND_TRACKED" {} \; -prune \) -o -exec echo Untracked directory: {} \; -exec /bin/bash -c "export FOUND_UNTRACKED=1" \; \)

echo $FOUND_UNTRACKED
echo $FOUND_TRACKED

查找工作正常,但不幸的是,exec中环境变量的更改不会传播。即,FOUND_TRACKED始终为空,FOUND_UNTRACKED为0。

知道如何让这些东西工作吗?

3 个答案:

答案 0 :(得分:1)

进程从父级继承环境。没有简单的机制来影响父母的环境:子进程可以改变自己的环境,但是当子进程退出时,它就会被丢弃。你打击脚本在子进程中启动find,然后在另一个子进程中启动另一个bash

解决此问题的一种方法是使子进程创建输出,然后父进程解释。这是一个简单的例子:

files="$( /bin/ls )"
if [ "$files" ]; then
    echo "found some files"
else
    echo "no files there"
fi

如果您需要来自子进程的更复杂的反馈,您可以在父进程中创建一个临时文件(使用mktemp),并让子进程将其输出保存到该进程,以便您可以处理孩子完成后,在父母中输出。

答案 1 :(得分:0)

将导出移到find之外,因为它将在子shell中运行,因此任何导出的变量都只会位于该shell中。

答案 2 :(得分:0)

虽然我同意其他答案 - 但我找不到git用户的find表达式的实用程序。 .git目录只在根...所以你最终报告git的子目录为'not tracked',这是不正确的。

这与其他SCM(如CVS)不同,其中每个目录级别都有CVS目录

相关问题