Setコマンドをオプションなしで使用すると、すべてのシェル変数と関数の名前と値が表示されます。
変数のみを表示し、出力からの関数を避けたいと思います。
すでにコメントで述べたように、env
はエクスポートされた変数のみを表示するため、要件に適合しません。
set
出力を処理して、変数定義のように見えないものをすべて除外することは、信頼性の低いハックです。特に、値に改行が含まれている変数の一部を見逃すことになります。最悪の場合でも、注意深く作成された関数は、偽の変数定義を表示する可能性があります。
最も簡単な解決策は、関数が(種類の)変数とは見なされないPOSIXモードに一時的に切り替えることです。
set -o posix
set
set +o posix
ただし、デフォルトモードがすでにPOSIXである場合、またはシェルが設定されているPOSIXモードに関係なくそのコマンドを機能させたい場合は、問題があります。
このような場合、回避策は次のとおりです。
(set -o posix;set)
これは、サブシェルで実行されるset
ビルトインのPOSIXモードのみを設定し、親シェルモードは影響を受けません。
最も簡単な解決策はenv
の代わりにset
を使用することですが、env
はall既存の変数を提供せず、に渡される変数のみを提供しますenv
で始まるプロセス(たとえば、エクスポートされていない変数はありません)。別のアプローチは、空白文字以外の文字列、=
、次に空白文字以外の文字列を含む行をset
の出力から検索することです。
set | grep -E '^\S+=\S'
ただし、これにより、複数行の値に設定された変数(デフォルト値に\n
が含まれるIFS
など)が失われます。
奇妙な理由で、declare -p
は変数のみをリストするようです:
$ declare -p
declare -x ANT_HOME="/usr/share/Apache-ant"
declare -- BASH="/usr/bin/bash"
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -A BASH_ALIASES=()
declare -a BASH_ARGC=()
declare -a BASH_ARGV=()
declare -A BASH_CMDS=()
...
もちろん、これには、すべての属性を持つ変数を再作成できるdeclare
コマンドが出力されるという欠点があります。出力で何をしようとしているのかによっては、それが実際に役立つ場合があります。
よくわかりませんが、牛は何かを考えています。
_____
( env )
-----
o ^__^
o (oo)\_______
(__)\ )\/\
||----w |
|| ||
つまり、代わりにenv
を使用するだけです。
彼女はjiliagreのコメントを読んだだけだと思います。
________________________________
/ But it will only show exported \
\ variables! /
--------------------------------
\ ^__^
\ (!!)\_______
(__)\ )\/\
!! ||----w |
|| ||