몇 가지 해결 방법은 다음과 같습니다.
$ comm -3 <(declare | sort) <(declare -f | sort)
고장:
declare
모든 정의 된 변수 (내 보낸 여부) 및 기능을 인쇄합니다.
declare -f
기능 만 인쇄합니다.
comm -3
둘 다 공통 인 모든 줄을 제거합니다. 실제로 이것은 변수 만 남기고 함수를 제거합니다.
내 보내지 않은 변수 만 인쇄하려면 :
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
다른 해결 방법 :
$ declare -p
변수 만 인쇄하지만 추악한 속성이 표시됩니다.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
다음을 사용하여 속성을 잘라낼 수 있습니다.
$ declare -p | cut -d " " -f 3
한 가지 단점은 IFS의 값이 표시되는 대신 해석된다는 것입니다.
비교:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
이 때문에 "
한 줄의 고독 때문에 추가 처리에 해당 출력을 사용하기가 매우 어렵습니다 . 이를 방지하기 위해 IFS-fu를 수행 할 수 있습니다.
다음을 사용하는 또 다른 해결 방법 compgen
:
$ compgen -v
bash 내장 compgen
은 완성 스크립트에서 사용하기위한 것입니다. 이를 위해 compgen -v
정의 된 모든 변수를 나열합니다. 단점 : 변수 이름 만 나열하고 값은 나열하지 않습니다.
다음은 값을 나열하는 해킹입니다.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
장점은 순수한 bash 솔루션입니다. 단점 :를 통한 해석으로 인해 일부 값이 엉망 printf
입니다. 또한 파이프 및 / 또는 루프의 서브 쉘은 추가 변수를 추가합니다.