2011-04-17 40 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