我想找到当前工作目录及其子目录中的所有目录,它们是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。
知道如何让这些东西工作吗?
答案 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目录