새로 도입된 환경 변수를 표시하기 위한 Bash 스크립트

새로 도입된 환경 변수를 표시하기 위한 Bash 스크립트

저는 개발 환경 설정을 담당하는 스크립트를 리버스 엔지니어링하는 데 도움이 되도록 이 테스트 스크립트를 만들고 있습니다.

스크립트:

#env-changes
#!/bin/bash
TESTED_SCRIPT=$1
shift
ENV_BEFORE=$(env | sort)
. $TESTED_SCRIPT
ENV_AFTER=$(env | sort)
diff <(printf '%s\n' "$ENV_BEFORE") <(printf '%s\n' "$ENV_AFTER")

가상 환경 스크립트:

#!/bin/bash
export I_AM_NEW=hello

용법:

$ ./env-changes dummy-env-script.sh 
21a22
> I_AM_NEW=hello

현재는 에서만 작동합니다 bash. POSIX와 호환되도록 만드는 방법에 대한 제안이 있으십니까?

답변1

첫 번째,POSIX source명령이 문제 PATH를 해결하려면 전체 경로를 사용해야 합니다.

sh ./env-changes ./dummy-env-script.sh

또는 휴대용 버전 은 다음과 source같습니다 ..

. "$1"

그러면 해당 <()구문이 POSIX가 아니므로 이 문제를 해결해야 합니다. 예를 들어 임시 파일을 사용할 수 있습니다.

tmp1=$(mktemp)
tmp2=$(mktemp)
env | sort > "$tmp1"
. "$1"
env | sort > "$tmp2"
diff "$tmp1" "$tmp2"
rm  "$tmp1" "$tmp2"

또는 다른 접근 방식:

ENV_BEFORE=$(env)
. "$1"
ENV_AFTER=$(env)
printf -- '%s\n%s\n' "$ENV_BEFORE" "$ENV_AFTER" | sort | uniq -u

uniq -u여기서는 두 개의 변수를 인쇄하고 정렬한 다음 고유한 줄만 인쇄하고 새 변수만 인쇄하도록 전달합니다 .

$ sh ./env-changes ./dummy-env-script.sh 
I_AM_NEW=hello

관련 정보