find -exec를 사용하여 환경 변수를 보존할 수 있습니까? FreeBSD 버전의 find를 사용하는 옵션이 표시되지 않습니다. 꼭 필요한 경우 for 루프로 전환할 수 있지만 exec의 단순성과 속도를 선호합니다.
내가 보기에 좋지 않다고 생각되는 또 다른 옵션은 환경을 덤프한 다음 실행 중인 명령에서 다시 읽는 것입니다.
편집하다:
find . -type f -name '*/*.patch/go' -exec go install {} \;
이 예에서는 http 프록시를 사용하고 싶습니다. 위의 글로벌 http 프록시를 구성하도록 git에 지시하는 코드가 이미 있습니다.
따라서 아래 예에서는 sh?를 접두사로 사용해야 합니다. 왜?
답변1
하위 프로세스는 항상 환경을 상속합니다. 이는 실행하는 유틸리티가 find ... -exec
해당 환경에 액세스할 수 있음을 의미합니다.
이것을 테스트해 보세요:
$ unset -v myvar1 myvar2
$ export myvar1='hello world'
$ myvar2='not exported'
$ find . -exec sh -c 'for pathname do printf "found %s, myvar1=%s, myvar2=%s\n" "$pathname" "$myvar1" "$myvar2"; done' sh {} +
found ., myvar1=hello world, myvar2=
found ./.bash_profile, myvar1=hello world, myvar2=
found ./.bashrc, myvar1=hello world, myvar2=
found ./.yashrc, myvar1=hello world, myvar2=
found ./.zshrc, myvar1=hello world, myvar2=
여기서는 두 쉘 변수를 모두 지운 myvar1
다음 myvar2
설정하고 내보내 myvar1
지만 아무것도 없습니다 myvar2
. 이는 myvar1
모든 하위 프로세스에서 상속될 수 있으며 myvar2
상속되지 않음을 의미합니다.
출력에서 볼 수 있듯이 find
내보낸 콘텐츠는 일괄적으로 발견된 경로 이름을 호출하는 작은 myvar1
따옴표 스크립트에서 사용할 수 있습니다 .sh -c
find
-exec
명령 앞에 할당을 사용하여 find
현재 셸에서 환경 변수 값을 설정하지 않고 환경 변수 값을 설정할 수도 있습니다. 이는 find
작동 방식 뿐만 아니라 표준 구문입니다 .
$ unset -v myvar1 myvar2
$ myvar2='now in environment' find . -exec sh -c 'for pathname do printf "found %s, myvar1=%s, myvar2=%s\n" "$pathname" "$myvar1" "$myvar2"; done' sh {} +
found ., myvar1=, myvar2=now in environment
found ./.bash_profile, myvar1=, myvar2=now in environment
found ./.bashrc, myvar1=, myvar2=now in environment
found ./.yashrc, myvar1=, myvar2=now in environment
found ./.zshrc, myvar1=, myvar2=now in environment
이 구문을 사용하지 않는 또 다른 예는 다음과 같습니다 find
.
$ unset -v x
$ x='hello there' sh -c 'printf "%s\n" "$x"'
hello there
$ printf "%s\n" "$x"
현재 쉘에서는 모드가 설정되어 있지 않습니다 x
( printf
마지막에 빈 줄이 출력됩니다).