2011-04-17 69 views
0

我想查找当前工作目录及其子目录中的所有目录,这些目录或者是git存储库的根目录,或者根本没有被git跟踪。bash:设置环境变量查找的执行

为此我写了这个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.

任何想法如何让这个东西工作?

回答

1

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

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

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

如果从一个子进程需要更复杂的反馈,你可以创建在父(使用mktemp)的临时文件,并获得子进程,以挽救他们输出到这一点,所以您可以在孩子完成后在父级处理输出。

0

将find导出到外部,因为这会在子shell中运行,所以任何导出的变量都只会位于该shell中。

0

虽然我同意其他答案 - 我无法找到您的查找表达式为git用户的实用程序。 .git目录只在根目录下......所以你最终会报告git的子目录为“未跟踪”,这是不正确的。

这与CVS等其他SCM不同,CVS在每个目录级别都有一个CVS dir