web-dev-qa-db-ja.com

setコマンドで表示された機能を削除するにはどうすればよいですか?

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

変数のみを表示し、出力からの関数を避けたいと思います。

8
frp farhan

すでにコメントで述べたように、envはエクスポートされた変数のみを表示するため、要件に適合しません。

set出力を処理して、変数定義のように見えないものをすべて除外することは、信頼性の低いハックです。特に、値に改行が含まれている変数の一部を見逃すことになります。最悪の場合でも、注意深く作成された関数は、偽の変数定義を表示する可能性があります。

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

set -o posix
set
set +o posix

ただし、デフォルトモードがすでにPOSIXである場合、またはシェルが設定されているPOSIXモードに関係なくそのコマンドを機能させたい場合は、問題があります。

このような場合、回避策は次のとおりです。

(set -o posix;set)

これは、サブシェルで実行されるsetビルトインのPOSIXモードのみを設定し、親シェルモードは影響を受けません。

14
jlliagre

最も簡単な解決策はenvの代わりにsetを使用することですが、envall既存の変数を提供せず、に渡される変数のみを提供しますenvで始まるプロセス(たとえば、エクスポートされていない変数はありません)。別のアプローチは、空白文字以外の文字列、=、次に空白文字以外の文字列を含む行をsetの出力から検索することです。

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

ただし、これにより、複数行の値に設定された変数(デフォルト値に\nが含まれるIFSなど)が失われます。

4
terdon

奇妙な理由で、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コマンドが出力されるという欠点があります。出力で何をしようとしているのかによっては、それが実際に役立つ場合があります。

3
muru

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

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

つまり、代わりにenvを使用するだけです。


彼女はjiliagreのコメントを読んだだけだと思います。

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