現在のシェルのbashのオプションを一覧表示するにはどうすればよいですか?


27

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

bashのmanページの22〜23行目:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  

bashのmanページで次のようないくつかの検索パターンを使用しました。

  • /^\s*set
  • /list

現在のシェルに適用されるこれらの設定のリストを印刷することは可能ですか?

回答:


26
printf %s\\n "$-"

単一文字列の単一文字オプションをリストします。

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

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

最初の無効シェルに-f同時に値保存中ilename拡張$-があれば- -でを$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)
#do what you want with options here
eval "$state"

引数set なしで呼び出して、シェルに現在設定されているすべての変数のリストを追加することもできます-シェルへの再入力のためにも引用されます また、bashでコマンドtypeset -fpを追加して、現在宣言されているすべてのシェル関数を含めることもできます。eval準備ができたら、まとめてまとめてください。alias同じものをさらに引数なしで呼び出すこともできます。それは...しかし、それをカバーするかもしれません。私はそれが"$@"あると思う-あなたがするbash前に、最初に配列に入れなければならないだろう、と思うset

いや、もありtrapます。これは少しおかしいです。通常:

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

...だけ印刷されます、これは私のサブシェルでサブシェルが新しいプロセスであるとの独自のセットを取得するのでtrapので、任意の継承されません-秒trap秒が、その親が明示的に無視していたもの- (ようtrap '' INT

しかしながら:

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

trapコマンド置換サブシェルで実行される最初で唯一のコマンドである場合traps、シェルへの安全な再入力のために引用符で囲まれた形式で現在設定されている親シェルのリストを再現するという特別な動作をします。そして、あなたは行うことができsave_trapsその後、 set引数なし-すでに述べた残りのすべて-ほとんどすべてのシェル状態のロックを取得します。ただし、元のシェルvar属性を明示的に追加export -pおよびreadonly -p復元したい場合があります。

とにかく、それで十分です。


おかげで、あなたのコードはうまく動作します。すべてのオプションの完全なリストを取得するには、set +o との 両方を使用する必要がありshoptますか?(shopt言葉になることができるようsettableに、manページで使用されているのでshoptable、私のために働く)
the_velour_fog

@ user4668401-それでうまくいくと思う。
mikeserv

TL; DR、ただしオプションを変更して「そのまま」戻す3行のソリューションでは+1000。それは、スクリプトまたはコピー/貼り付け可能な指示を作成するときに必要なものです。
バルミプール

@mikeserv イオンを含めるために状態を保存するときに-pオプションを追加する必要があるようです。shoptstate=$(set +o;shopt -p)
nkatsar

9

manページから:

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

有効なすべてのオプションのリストを印刷します。


うまくいきました、ありがとう。これにsetとの両方で設定可能なオプションがリストされているかどうか知っていますshoptか?
-the_velour_fog

@ user4668401いいえ、setはるかに広範囲です。マニュアルページのエントリを参照してください
jasonwryan

そして、単一のオプションがオンになっているかどうかを確認するには:shopt <option>
-kos

これには、名前に「on」が含まれるオプト(つまりhuponexit)が含まれます。簡単な修正方法はshopt | grep on$
マイクD

6

すべてのオプションをリストするには:

set -o

特定のオプションを検査するには:

set -o | grep <OPTION>

verbose例としてオプションを取り上げます。

$ set -o | grep verbose
verbose         off

6

オプション?:bashには3つのグループのオプションがあります。

  1. コマンドによって読み取られるまたは設定されるオプションset
    (手動のために、このコマンドを使用します。LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash
    すべての1文字オプション:abefhkmnptuvxBCEHPT

    また、オプション(1文字に相当するものはありません):

    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. :起動時に設定することができますオプション
    (マニュアル用のコマンド: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 -oます。shopt -poと同じ結果を得るために使用しますset +o

買い物オプションをリストするには:

shopt -p

そのうち、設定されているものと設定されていshopt -psないもののどちらを印刷するかを選択できますshopt -pu

すべてのオプションを取得します。可能な限り多くの長いオプションと-sDcINVOCATIONの一部()を印刷することはできません:

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

それらを変数に保存するには:

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

また、変数を使用してすべてのオプションを戻すことができます。

$ eval "$storeoptions"

1

特定のオプションを検査するには:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.