現在のシェルの Bash オプションをどのようにリストしますか?

現在のシェルの Bash オプションをどのようにリストしますか?

Bashインタプリタ自体にはオプションがあります。

たとえば、行22-23に記載されている内容は次のとおりです。バッシュのマニュアルページ:

オプション
セット組み込みコマンドの説明に文書化されているすべての単一文字シェルオプションは、シェルを呼び出すときにオプションとして使用できます。また、bashは呼び出し時に次のオプションを解釈します。
-c ...
-i ...
-l ...
-r ...

私はBashのマニュアルページでいくつかの検索パターンを使用します。たとえば、次のようになります。

  • /^\s*set
  • /list

現在のシェルに適用されているこれらの設定のリストを印刷できますか?

答え1

printf %s\\n "$-"

単一文字オプションは単一文字列としてリストされます。

このパラメーターは、次のように使用することもできます。

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

-fin値を保存するときは、まずシェルファイル名拡張を無効にしてください。その後、globは発生せず、最後のファイル名拡張子を再度有効または無効にすることができます。$-$1+f

たとえば、-fファイル名拡張子を無効にした状態で値を最初に保存した場合、保存された$-値は次のようになります。(少なくとも):

f

だからsetもう一度実行すると、結果は次のようになります。

set +f -f

これはあなたが始めた場所に戻るだけです。

set +o

setすべてのテーブルシェルオプションを一覧表示します。(望むよりジェイソンの答えできる人のためにshopt- それは言いますか? - オプション)シェルの再進入に安全な形になっています。このようにして、次の操作も実行できます。

state=$(set +o)
set -some -crazy -options
eval "$state"

シェルオプションの状態をそれぞれ保存、変更、および復元します。

shoptイオンとテーブルのオプションを一度に処理するには:set

state=$(set +o; shopt -p) 
#do what you want with options here
eval "$state"

また、電話することができますset いいえ現在のシェルによって設定されているすべての変数のリストを追加するために使用される引数は、シェルに戻すために引用することもできます。 bashにこのコマンドを追加して、typeset -fp現在宣言されているすべてのシェル関数を含めることもできます。準備ができたら、すべてを1つにまとめることができますevalaliasパラメータなしで同じものを呼び出すこともできます。しかし、これは…隠すことができます。私の考えでは、そうする前に"$@"配列に入れなければならないと思います。bashset

いいえ、まだありますtrap。これはちょっと面白いですね。通常:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

...印刷のみ可能これは私のサブシェルですサブシェルは新しいプロセスであり、独自のセットを持つため、どのtrapsも継承されませんが、trap親プロセスが明示的に無視するsは継承されます。(良いtrap '' INT

しかし:

trap 'echo this is my trap' 0
save_traps=$(trap)

trap初めての場合は特別になります。ただこのコマンドは、親シェルの現在の設定リストを引用形式で再現してtrapsシェルに安全に戻すために、コマンド代替サブシェルで実行されます。だからあなたはこれを行うことができますsave_trapsそれから set引数がなければ - そしてすでに言及されている残りのすべて - ほとんどすべてのシェル状態がロックされます。ただし、元のシェルvar属性を明示的に追加してexport -p復元することもできます。readonly -p

とにかく十分です。

答え2

オプション? :Bashには3つのオプションセットがあります。

  1. オプションはコマンドで読み取りまたは設定されますset
    (マニュアルでこのコマンドを使用してください。LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash
    すべての単一文字オプション:abefhkmnptuvxBCEHPT

    オプションもあります(単一文字に該当しません)。

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
    
  2. オプションはコマンドで読み取りまたは設定されますshopt
    (このコマンドを使ってマニュアルを読んでくださいLESS=+/'shopt \[-pqsu\]' man bash'。)
    リストは長いですが、印刷は簡単です。以下を使用してください。

    $ shopt -p
    

    または、次のようなものですが、同じではありません。

    $ shopt
    
  3. INVOCATIONに設定できるオプション:(
    手動コマンドLESS=+/'^INVOCATION' man bash:)

    すべてのsetオプション:

    bash -abefhkmnptuvxBCEHPT
    

    すべてのshoptオプション

    bash -O option
    

    一部のオプションはbashを呼び出すときにのみ意味があります。

    bash -lirsDc
    

    また(長いオプション):

    bash --debugger --help --init-file file --rcfile file --login \
         --noediting --noprofile --norc --posix --restricted \
         --verbose --version
    

すべてset1文字オプションで-ri印刷されます$-

-i      Interactive  
Only read with `$-` (if it contains an `i`).
-r      Restricted
Also read with `shopt -p restricted_shell

たとえば、

$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri

bash をログインシェルとして呼び出すには、shopt レポートを使用します。

-l      Login
read with `shopt -p login_shell`

したがって:

$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell

このオプションは-nコードが実行されないことを意味するため、どのコードでもテストできません。


印刷オプション

オプションリストに最適なツール走るシェルでは、setまたはに設定された値はshopt同じですshopt。リスト設定オプション:

shopt -o

それはまったく同じように動作しますset -oshopt -poと同じ結果を得るために使用してくださいset +o

リストストアオプション:

shopt -p

shopt -ps設定した内容を印刷するかどうかを選択できます。shopt -pu

すべてのオプションを取得するには。できるだけ多くの長いオプションと-sDcINVOCATIONの一部()を印刷することはできません。

$ echo $-; shopt -p ; shopt -po

変数に保存するには:

$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"

この変数は、すべてのオプションを設定するために使用できます。

$ eval "$storeoptions"

答え3

~からこのmanページ:

shopt
...オプションがない場合、または-pオプションを使用すると、設定可能なすべてのオプションのリストが表示され、各オプションが設定されているかどうかを示します。
shopt | grep "on$"

有効になっているすべてのオプションのリストが印刷されます。

答え4

特定のオプションを確認するには:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi

関連情報