GNU/Linux bash 셸에서는 디버깅 목적으로 특정 시점의 모든 사용자 정의 변수를 식별하고 저장하는 명령을 사용합니다(나중에 파일을 가져오겠습니다).
declare | grep '^[[:lower:]]' | grep -v '^colors' | sort > ${output_dir}/env_variables.tmp
나는 "우연의 프로그래머"이고 모든 시스템 변수( 제외 colors
)가 대문자로 시작한다고 믿기 때문에 이것이 나쁜 습관이라는 것을 알고 있습니다. 더 나은 방법을 생각하고 싶습니다.
또한 스크립트를 실행하기 전에 현재 환경 변수의 버전을 저장하고 하위 쉘의 환경 변수를 간단히 비교하는 것도 고려했습니다. 이것은 현재 시도만큼 해키해 보이기 때문에 날짜나 사용자 정의 또는 특정 하위 쉘에 의해 새로 생성된 변수를 식별하기 위한 다른 기준으로 변수를 필터링하는 방법이 있는지 궁금합니다.
답변1
아니요. 날짜나 소유자별로 변수를 필터링할 수 없습니다. 모든 기존 변수를 읽기 전용으로 설정한 다음 declare -p
필터를 사용하여 이러한 변수를 필터링할 수 있습니다. 하지만 이 문제를 해결하는 더 일반적인 방법은 사용 가능한 모든 항목에 접두사를 붙이는 것입니다 __project_
(여기서프로젝트무엇인가요). 변수가 매우 길어지지만 이것이 가장 안전한 접근 방법인 것 같습니다.
시작시 변수를 저장한다는 당신의 아이디어는 전혀 나쁘지 않습니다. 이름만 저장할 수 있어요
declare |awk -F= '/=/ { print $1 }' >tmpfile.$$.shvars
아니면 읽기 전용 개념으로 돌아가세요.
while read var ; do declare -r var; done < tmpfile.$$.shvars
이제 선언하고 나중에 완료되면 다음을 수행합니다.
declare -p |awk '$2 !~ /^.r$/ { print $3 }' |cut -d= -f1
변수 목록을 가져옵니다. 단점은 이러한 모든 변수가 이제 읽기 전용이라는 점입니다.
답변2
셸에서 변수(환경 변수 또는 내보내지 않은 매개변수)를 설정하면 새 변수와 이전에 설정된 변수 간에 차이가 없습니다. 따라서 마음속에 떠오르는 두 가지 솔루션(변형)은 다음과 같습니다.
- 명명 규칙을 사용하여 관심 있는 항목을 설명합니다(대문자 대 소문자).
- 전후 스냅샷 찍기
최고의 노력을.