함수와 환경 변수를 건너뛰고 Bash에서 로컬 및 전역 변수의 값을 얻으려면 어떻게 해야 합니까?
declare -p
나에게 전체 더미를 주었다. 그러나 내가 그것에 의존할 수 있는지는 확실하지 않습니다 declare -p
. 또한 함수가 포함될 수 있는지 help declare
여부도 출력에서 불분명합니다 . declare -p
실험에 따르면 이는 사실이 아닙니다.
예: 일부 변수의 출력은 다음과 유사합니다.
declare -- VARNAME="Variable value"
declare
...그리고 다음과 같이 대신 옵션을 제공하는 다른 것들도 있습니다 --
:
declare -ir UID="197609"
이제 내가알다출력에 대해 이 형식을 사용할 수 있습니다 . 간단히 이와 유사한 루프를 사용하여 출력을 읽기 전용 정수 변수로 제한 declare
할 수 있습니다 .while
while read -r decl opts keyval; do
if [[ "$opts" == *ir* ]]; then # could obviously also be case/esac
echo "$keyval"
fi
done < <(declare -p)
...따라서 관심이 없는 변수 유형을 지웁니다.
질문:하지만할 수 있는젠장, 그렇습니까? 그렇지 않다면 또 어떤가간결특정 기준에 따라 변수를 필터링하는 방법이 있습니까?
참고: 저는 Bash >=5.0에 관심이 있습니다. 현재 제 컴퓨터에서는 5.2.15를 사용하고 있습니다.
답변1
typeset
/ 를 사용하여 변수 유형을 쿼리할 수 있습니다 declare
-p
. +F
함수는 제외되고 환경을 통해 설정된 변수는 표시되므로 -x
정규식을 사용하여 이 문제를 해결할 수 있습니다.
declare -p +F | grep -Ev '^declare -x'
이름만 원하시나요?
declare -p +F | sed -n 's/^declare -[^x] \([^=]*\).*/\1/p'
답변2
존재하다 bash
:
comm -23 -- <(compgen -v | sort) <(compgen -e | sort)
여기서 내보낸 변수는 모든 변수 목록에서 comm
제외됩니다 .e
v
그리고 zsh
:
set -o extendedglob
print -roC1 -- ${(k)parameters[(R)^*export*]}
$parameters
매개변수 이름을 해당 유형 및 속성 목록에 매핑하는 특수 연관 배열입니다.
여기서는 이 연관 배열의 값에 포함되지 않은 값을 print
열을 기준으로 정렬했습니다 .r
o
1
C
k
export
special
, hide
또는 undefined
(자동 로딩 준비)을 제외할 수도 있습니다 .