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
シェルで変数(環境変数またはエクスポートされていないパラメータ)を設定すると、新しい変数と以前に設定された変数との間に違いはありません。したがって、心に浮かぶ2つの解決策(変形)は次のとおりです。
- 命名規則を使用して、関心のある項目を説明します(大文字と小文字)。
- 前後のスナップショットを撮る
最高の努力を。