Bashスクリプトで宣言され使用されているすべての変数を印刷する方法はありますか?
たとえば、printf "%s\n" "${FUNCNAME[@]}"
現在実行中の呼び出しスタック内のすべてのシェル関数の名前が印刷されます。
たとえば、次のようになります。私のスクリプトの内容は次のとおりです(宣言された変数がたくさんあるはずです)。
#!/bin/bash
say_hello() {
name="$1"
echo "Hello $name"
}
my_name="Luis Daniel"
my_age="29"
say_hello "$my_name"
次に、次のように記録する必要があります。
my_name = Luis Daniel
my_age = 29
name = Luis Daniel
ベストアンサー1
これらのコマンドset
またはdeclare
それ自体は、すべてのシェル変数とその値を印刷します(関数定義も印刷します)。declare -p
関数定義は印刷されませんが、各変数には対応する型(-r
読み取り専用、-a
配列など)がコメントとして追加されます。コマンド自体は、export
と同様に環境変数(エクスポートされたシェル変数)を印刷します。env
printenv
変数かどうか使用されるあるいは、現在シェルセッション内にないことがこれらのコマンドの出力で必ず検出されるわけではありません。シェルにはbash
次のような多くの変数があります。どのRANDOM
使用するかEUID
どうかにかかわらず、シェルセッション。declare
呼び出し時に現在のスコープで変数を使用できない可能性があります。たとえば、関数のローカル変数であるか、すでに存在しているか、アクティブになっていないサブシェルunset
で宣言されているとします。
特定のスクリプトで生成された変数を表示するには、たとえばスクリプトの先頭に出力を保存し、スクリプトのdeclare -p
最後(またはどこにいても)で同じコマンドの他の呼び出しと比較する必要があります。現在の宣言変数を調べたい)
例:
#!/bin/bash
tmpfile=$(mktemp)
declare -p >"$tmpfile"
say_hello() {
name="$1"
echo "Hello $name"
}
my_name="Luis Daniel"
my_age="29"
say_hello "$my_name"
declare -p | diff "$tmpfile" -
rm -f "$tmpfile"
実行してください:
$ bash script.sh
Hello Luis Daniel
46c46,49
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"
> declare -- name="Luis Daniel"
関数で変数として宣言すると、次のようにname
なります。local
declare -p
Hello Luis Daniel
46c46,48
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"