Bash에서 전역 및 로컬 셸 변수(함수나 환경 변수가 아님)만 가져오는 깔끔한 방법

Bash에서 전역 및 로컬 셸 변수(함수나 환경 변수가 아님)만 가져오는 깔끔한 방법

함수와 환경 변수를 건너뛰고 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제외됩니다 .ev

그리고 zsh:

set -o extendedglob
print -roC1 -- ${(k)parameters[(R)^*export*]}

$parameters매개변수 이름을 해당 유형 및 속성 목록에 매핑하는 특수 연관 배열입니다.

여기서는 이 연관 배열의 값에 포함되지 않은 값을 print열을 기준으로 정렬했습니다 .ro1 Ckexport

special, hide또는 undefined(자동 로딩 준비)을 제외할 수도 있습니다 .

관련 정보