저는 개발 환경 설정을 담당하는 스크립트를 리버스 엔지니어링하는 데 도움이 되도록 이 테스트 스크립트를 만들고 있습니다.
스크립트:
#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