setコマンドでマークされた機能を削除するには? [コピー]

setコマンドでマークされた機能を削除するには? [コピー]

オプションなしでsetコマンドを使用すると、すべてのシェル変数と関数の名前と値が表示されます。

我々は変数を表示し、出力で関数を避けたいと思います。

答え1

すでにコメントで指摘したように、envこれはエクスポートされた変数のみを表示するため、要件を満たしていません。

変数定義のように見えないものをフィルタリングするために出力を処理するsetことは、信頼できないハッキングです。特に、値に改行文字を含む変数を見逃す可能性があります。さらに悪いことに、よく書かれた関数が偽変数の定義のために困難になる可能性があります。

最も簡単な解決策は、関数が(ある種の)変数として扱われないPOSIXモードに一時的に切り替えることです。

set -o posix
set
set +o posix

ただし、デフォルトモードがすでにPOSIXの場合、またはシェルが設定されているPOSIXモードでコマンドが機能するようにしたい場合は、問題が発生する可能性があります。

この場合、回避策があります。

(set -o posix;set)

これは、サブシェルで実行される組み込みコマンドに対してのみPOSIXモードを設定し、set親シェルモードには影響しません。

答え2

env最も簡単な解決策は代わりに使用することですが、提供されていませんsetenvみんな既存の変数。ただし、開始されたプロセスに渡される変数のみenv(エクスポートされていない変数なし)もう1つのアプローチは、set空白以外の文字列、an、および=空白以外の文字列を含む行の出力を取得することです。

set | grep -E '^\S+=\S' 

ただし、これを行うと、複数行の値に設定された変数(IFSデフォルトにはaが含まれます\n)がありません。

答え3

奇妙な理由で変数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変数とその属性の両方を再生成するコマンドを出力するという欠点がある。出力で何をしたいかによって、これは本当に役に立ちます。

答え4

よくわかりませんが、牛はいろいろ考えています。

 _____
( env )
 -----
        o   ^__^
         o  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

つまり、単に使用してくださいenv


私の考えでは、彼女はちょうどjilliagreのコメントを読んだと思います。

 ________________________________
/ But it will only show exported \
\ variables!                     /
 --------------------------------
        \   ^__^
         \  (!!)\_______
            (__)\       )\/\
             !! ||----w |
                ||     ||

関連情報