あまり知られていない XNUMX つの Bash オプション

いくつかの Bash オプションはよく知られており、よく使用されます。 たとえば、多くの人はスクリプトの最初に次のように書きます。

set -o xtrace

デバッグ用に、

set -o レイズ

間違って終了したり、

set -o errunset

呼び出された変数が設定されていない場合に終了します。

しかし、他にも多くの選択肢があります。 manas ではあまりにもわかりにくく説明されている場合があるので、ここでは最も役立つもののいくつかを説明付きで集めました。

注: Mac には古いバージョンの bash (3.x ではなく 4.x) がインストールされている場合があり、これらのオプションのすべてが利用できるわけではありません。 この場合、次を参照してください。 ここで または ここで.

set または shopt?

bash オプションを設定するには、スクリプトから行う方法とコマンド ラインから行う方法の XNUMX つがあります。 組み込みコマンドを使用できます set и shopt。 どちらもシェルの動作を変更し、(引数が異なるだけで)ほぼ同じことを行いますが、次の点で異なります。 起源。 オプション set パラメータは他のシェルのパラメータから継承または借用されますが、 shopt bashで作成されました。

現在のオプションを確認したい場合は、次を実行します。

$ set -o
$ shopt

でオプションを有効にするには set 長い構文または短い構文が使用されます。

$ set -o errunset
$ set -e

効果も同様です。

このオプションを無効にするには、マイナスの代わりにプラスを入力する必要があります。

$ set +e

ロジックが間違っているように思えたため、長い間この構文を思い出せませんでした (マイナス記号はオプションを有効にし、プラス記号はオプションを無効にします)。

В shopt (より論理的な) フラグはオプションを有効または無効にするために使用されます -s (セット)と -u (未設定):

$ shopt -s cdspell # <= on
$ shopt -u cdspell # <= off

ディレクトリの変更

ディレクトリの操作に役立つオプションがいくつかあります。

1.cdスペル

この設定を使用すると、bash はタイプミスを認識し始め、スペルを間違えた名前のフォルダーに移動します。

$ shopt -s cdspell
$ mkdir abcdefg
$ cd abcdeg
abcdefg
$ cd ..

私はこのオプションを長年使用してきましたが、非常にまれに (おそらく XNUMX 年に XNUMX 回)、非常に奇妙な決定を下します。 でも他の日には cdspell 文字通り毎日、時間を節約できます。

2.オートCD

複数のエントリの非効率性を受け入れたくない場合 cd, その後、X コマンドが存在しない場合に X フォルダーに移動するようにこのオプションを設定できます。

$ shopt -s autocd
$ abcdefg
$ cd ..

オートコンプリートと組み合わせると、フォルダー間をすばやく移動できます。

$ ./abc[TAB][RETURN]
cd -- ./abcdefg

フォルダに名前を付けないでください rm -rf * (はい、ちなみに、これは可能です)。

3.方向拡張

これは、Tab キーを押して環境変数を展開する優れたオプションです。

$ shopt -s direxpand
$ ./[TAB]     # заменяется на...
$ /full/path/to/current_working_folder
$ ~/[TAB]     # заменяется на...
$ /full/path/to/home/folder
$ $HOME/[TAB] #  заменяется на...
$ /full/path/to/home/folder

きれいな出力

4.ジョブのチェック

このオプションは、バックグラウンドで実行中のジョブがまだある場合、セッションからのログアウトを停止します。

終了する代わりに、未完了のタスクのリストが表示されます。 それでも終了したい場合は、もう一度入力してください exit.

$ shopt -s checkjobs
$ echo $$
68125             # <= ID процесса для оболочки
$ sleep 999 &
$ exit
There are running jobs.
[1]+  Running                 sleep 999 &
$ echo $$
68125             # <= ID процесса для оболочки тот же
$ exit
There are running jobs.
[1]+  Running                 sleep 999 &
$ exit
$ echo $$
$ 59316           # <= на этот раз ID процесса  изменился

代替超大国

5.グロブスター

このオプションにより、代替のスーパーパワーが得られます。 次のように入力すると、

$ shopt -s globstar
$ ls **

その後、シェルはすべてのディレクトリとサブディレクトリを再帰的に表示します。

と組み合わせて direxpand 階層の下位にあるすべてのものをすぐに表示できます。

$ shopt -s direxpand
$ ls **[TAB][TAB]
Display all 2033 possibilities? (y or n) 

6.extglob

このオプションは、正規表現に関連する一般的な機能を有効にします。 場合によっては、これは非常に便利です。

$ shopt -s extglob
$ touch afile bfile cfile
$ ls
afile bfile cfile
$ ls ?(a*|b*)
afile bfile
$ ls !(a*|b*)
cfile

ここでは、パターンが括弧内に配置され、垂直バーで区切られています。 利用可能な演算子は次のとおりです。

? = は、指定されたパターンの XNUMX 回または XNUMX 回の出現に一致します。 = 指定されたパターンに一致しないすべてを表示 * = XNUMX 回以上の出現 + = XNUMX 回以上の出現 @ = XNUMX 回だけ出現

事故防止

7. ヒストベリファイ

略語の履歴からクイック起動コマンドを使用するのは、最初は少し怖いかもしれません。 !! и !$.

オプション histverify 実際に実行する前に、まず Bash がコマンドをどのように解釈するかを確認できます。

$ shopt -s histverify
$ echo !$          # <= По нажатию Enter команда не запускается
$ echo histverify  # <= Она сначала демонстрируется на экране,
histverify         # <= а потом запускается 

8. ノクロバー

繰り返しますが、事故、つまりリダイレクト演算子で既に存在するファイルを上書きすることを防ぐためです (>)。 バックアップがない場合、これは大惨事になる可能性があります。

オプション set -С このような上書きを禁止します。 必要に応じて、演算子を使用して保護をバイパスできます。 >|:

$ touch afile
$ set -C
$ echo something > afile
-bash: afile: cannot overwrite existing file
$ echo something >| afile
$

出所: habr.com

コメントを追加します