이것은 아마도 정말 어리석은 일이지만 어디에서도 답을 찾을 수 없습니다. 프로세스를 보다 체계적으로 만들기 위해 .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 )