while 루프 내에서 소스 코드가 작동하지 않습니다.

while 루프 내에서 소스 코드가 작동하지 않습니다.

이것은 아마도 정말 어리석은 일이지만 어디에서도 답을 찾을 수 없습니다. 프로세스를 보다 체계적으로 만들기 위해 .bashrc.d소스 코드를 가져오려는 스크립트가 포함된 디렉터리를 설정해 보았습니다 . .bashrc의 모든 스크립트를 수동으로 가져오는 대신 .bashrc.d다음과 같은 방법으로 가져옵니다.

if [ -d "$HOME/.bashrc.d" ]; then
    find "$HOME/.bashrc.d/" -type f -name "*.sh" | sort | \
        while read -r f; do
            source "$f"
        done
fi

그러나 source "$f"명령이 실제로 파일을 가져오지 않기 때문에 하위 쉘 내에서 실행되는 것으로 보입니다. 의 출력에서 ​​볼 수 있듯이 이를 실행 set -x하지만 예를 들어 변수 내보내기는 원래 반복 셸로 전달되지 않습니다. 또한 .bashrc파일을 수동으로 소싱하는 것이 실제로 작동하기 때문에(문제가 해결되지는 않지만) 에서 소싱하는 것이 아니라 while 루프 내에서 소싱하는 데 문제가 있다는 것도 알고 있습니다 . 정확히 무슨 일이 일어났으며 이 문제를 해결하는 방법은 무엇입니까?

답변1

당신 말이 맞습니다. 당신은 source서브 쉘에서 실행 중입니다. 이 문제를 해결하려면 find의 출력을 파이핑하지 않고 파일을 반복하면 됩니다.

for script in "$HOME"/.bashrc.d/*.sh
do
    if [ -r "$script" ]
    then
        . "$script"
    fi
done

답변2

while명령이 서브셸에서 실행되는 대신 파이핑됩니다 . 이 lastpipe옵션을 설정하면 작업 제어가 포함된 대화형 셸에는 도움이 되지 않습니다. "프로세스 교체"를 시도하십시오(귀하의 bash버전에서 제공하는 경우).

while read -r f; do source "$f"; done < <( find "$HOME/.bashrc.d/" -type f -name "*.sh" | sort ) 

관련 정보