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

specialhideまたはundefined(自動ロード準備)を除外することもできます。

関連情報