私はスクリプトを書いていますが、この場合、スクリプトで定義されているすべての変数名と値のダンプを見ることができれば本当に役立ちます。例は次のとおりです。
foo="1"
bar="2"
print_script_variables
baz="3"
print_script_variables
すると、以下が出力されます。
foo="1"
bar="2"
foo="1"
bar="2"
baz="3"
似たようなものがprint_script_variables
ありますか?実行中のスクリプトを解析するのは愚かなことだと思います。
これが存在しない場合は、手動で複数のecho
コマンドを入力した可能性があります。問題を解決するときに場所を移動したいとprint_script_variables
思い、どの変数がスコープに入って来るのか心配する必要はないので、これは少し迷惑です。
これはbashスクリプトですが、端末でzshを使用するので、両方で動作するのが理想的です。
答え1
muruの回答に加えて、スクリプトの先頭に環境変数名を保存し、print_script_variables関数が呼び出されたときに環境変数をフィルタリングできます。 POSIX 準拠のメソッドでは、set ユーティリティを使用してスクリプトの先頭にすべての変数をリストし、一時ファイルに保存します。 print_script_variables関数を呼び出すときは、diffを使用して不要な変数をフィルタリングします。
# invoke at script start
set > /tmp/file1 # assuming /tmp/file1 is a safely generated temporary file
trap 'rm -f /tmp/file1' INT TERM HUP EXIT # delete the file on SIG{INT,TERM,HUP} and EXIT
print_script_variables() {
# suppress lines unique to file1 and lines present in pipe (set output)
# that it outputs only lines added to file1, i.e. new variables
set | comm -13 /tmp/file1 - # edited; thanks to Martin for helping to save an extra file;
}
variable=20
print_script_variables
編集する
最初の行を自動的に実行する方法が必要な場合は、次のものを使用できます。ポイント(またはソース)スクリプトの先頭でこの行を自動的に実行するユーティリティです。最初の行と関数定義をファイルに保存する必要がありますprint_script_variables
。たとえば、次のようになります。
set > /tmp/file1
trap 'rm -f /tmp/file1' INT TERM HUP EXIT
print_script_variables() {
set | comm -13 /tmp/file1 -
}
以下のように、スクリプトの先頭からそのファイルをインポートします。
. print_script_variables
variable=20
print_script_variables()
答え2
これはgrepを使用して継承された変数をフィルタリングする別のオプションです。
#!/usr/bin/env bash
# Store names of inherited variables (by definition, exported)
readonly GREP_FILTERS=$(env | cut -d= -f1 | xargs printf " -e %s" )
print_script_vars() {
declare -p | grep -v -E $GREP_FILTERS
}
使用氏名-pすべてのシェル変数を表示するには、または環境変数のエクスポートにのみ興味がある場合。
答え3
Adam Mlodzinskiの改良コード
#!/bin/sh
# Store names of inherited variables (by definition, exported)
readonly GREP_FILTERS=$(env | cut -d= -f1 | xargs printf " -e %s" )
print_script_vars() {
declare -p | grep -v -E $GREP_FILTERS | sed 's/declare -[^ ]\{1,2\} //' | grep =
}
variable=20
print_script_vars