Bash(Unixシェル)
Bashコマンド構文は、Bourneシェルコマンド構文のスーパーセットです。 Bashは、他の機能の中でbash2.05a以来、ブレース拡張、コマンドライン補完(プログラム可能な補完)、基本的なデバッグと信号処理(trap
を使用)をサポートしています。 Bashは、Bourneシェルスクリプトの大部分を変更せずに実行できますが、Bourneシェルスクリプトは、Bashで異なる解釈の構文動作に遭遇したり、新しいBash組み込みに一致するシステムコマンドを実行しようとしたりすることを除いて、bourneシェルスクリプトを変更することなく実行できます。 Bashコマンド構文には、コマンドライン編集、コマンド履歴(history
$RANDOM
$PPID
変数、POSIXコ>.
ユーザーが対話型のコマンドシェル内でtabキーを押すと、Bashは自動的にベータ版2.04以降のコマンドライン補完を使用して、部分的に型指定されたプログ Bashのコマンドライン補完システムは非常に柔軟でカスタマイズ可能で、多くの場合、特定のプログラムやタスクの引数とファイル名を完了する関数でパッケージ化されています。Bashの構文には、Bourneシェルに欠けている多くの拡張機能があります。 Bashは、外部プロセスを生成せずに整数計算(”算術評価”)を実行できます。 この目的のために((…))
$((…))
変数構文を使用します。 その構文は、I/Oリダイレクトを簡素化します。 たとえば、&>
演算子を使用して、標準出力(stdout)と標準エラー(stderr)を同時にリダイレクトできます。 これは、Bourneシェルに相当する’command > file 2>&1
‘よりも簡単に入力できます。 Bashは、<(command)
>(command)
構文を使用して、ファイル名が通常使用されるコマンドの出力(または入力)を置き換えるプロセス置換をサポー (これは、それをサポートするシステム上の/proc/fd/unnamedパイプ、または必要に応じて一時的な名前付きパイプを介して実装されます)。
‘function’キーワードを使用すると、Bash関数宣言はBourne/Korn/POSIXスクリプトと互換性がありません(’function’を使用するとKornShellに同じ問題があります)が、BashはBourneおよびKornシェルと同 これらの違いやその他の違いのために、Bashシェルスクリプトは、その互換性を念頭に置いて意図的に書かれていない限り、BourneまたはKornシェルインタプリタ しかし、POSIXモードでは、BashはPOSIXにより密接に準拠しています。
Bashはここで文書をサポートしています。 バージョン2.05b以降、Bashは<<<
演算子を使用して”here文字列”から標準入力(stdin)をリダイレクトできます。
Bash3.0は、Perlを連想させる構文を使用したインプロセス正規表現のマッチングをサポートしています。
2009年、Bash4.0は連想配列のサポートを導入しました。 連想配列インデックスは、AWKまたはTclと同様の方法で文字列です。 これらは多次元配列をエミュレートするために使用できます。 Bash4はまた、ライセンスをGplv3に切り替えます; 一部のユーザーは、このライセンス変更がMacOSが古いバージョンを引き続き使用する理由であると考えています。 Appleは2019年のMacOS Catalinaのリリースで、オペレーティングシステムでのBashの使用を最終的に停止しました。
Brace expansionEdit
alternationとも呼ばれるBrace expansionは、Cシェルからコピーされた機能です。 これは、代替の組み合わせのセットを生成します。 生成された結果はファイルとして存在する必要はありません。 展開された各文字列の結果はソートされず、左から右の順序が保持されます:
$ echo a{p,c,d,b}eape ace ade abe$ echo {a,b,c}{d,e,f}ad ae af bd be bf cd ce cf
bourneシェルは同じ出力を生成しないため、ポータブルシェルスクリプトで中括弧の展開を使用するべきではありません。
$ # A traditional shell does not produce the same output$ /bin/sh -c 'echo a{p,c,d,b}e'a{p,c,d,b}e
中括弧の展開がワイルドカードと組み合わされると、中括弧が最初に展開され、結果のワイルドカードが通常置換されます。 したがって、現在のディレクトリ内のJPEGおよびPNG画像のリストは、以下を使用して取得できます:
ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which, # the wildcards are processedecho *.{png,jp{e,}g} # echo just show the expansions - # and braces in braces are possible.
交互に加えて、中括弧の展開は、二つの整数または二重ドットで区切られた文字の間の連続範囲に使用することができます。 Bashの新しいバージョンでは、第三の整数が増分を指定することができます。
$ echo {1..10}1 2 3 4 5 6 7 8 9 10$ echo file{1..4}.txtfile1.txt file2.txt file3.txt file4.txt$ echo {a..e}a b c d e$ echo {1..10..3}1 4 7 10$ echo {a..j..3}a d g j
中括弧の展開が変数の展開と組み合わされると、中括弧の展開の後に変数の展開が実行され、場合によってはeval
ビルトインの使用が必要になることがあります。:
$ start=1; end=10$ echo {$start..$end} # fails to expand due to the evaluation order{1..10}$ eval echo {$start..$end} # variable expansion occurs then resulting string is evaluated1 2 3 4 5 6 7 8 9 10
スタートアップscriptsEdit
Bashが起動すると、さまざまなドットファイルでコマンドが実行されます。 Bashシェルスクリプトとは異なり、ドットファイルには通常、実行権限が有効になっておらず、#!/bin/bash
~/.bash_profile
はBourneシェルと互換性があり、~/.bashrc
~/.bash_login
のcshに似たセマンティクスを提供します。 && cmd
&&
後の部分がない場合はスキップします。
&& . ~/.profile # set up environment, once, Bourne-sh syntax onlyif ; then # are we interactive? && . ~/.bashrc # tty/prompt/function setup for interactive shells && . ~/.bash_login # any at-login tasks for login shell onlyfi # End of "if" block
Bash startupEditでのオペレーティングシステムの問題
UnixおよびLinuxの一部のバージョンには、一般的に/etc
ディレクトリの下にBashシステムスタートアップスクリプトが含まれています。 Bashは標準の初期化の一部としてこれらを呼び出しますが、他の起動ファイルは文書化されたBash起動シーケンスとは異なる順序でそれらを読み取るこ Rootユーザーのファイルのデフォルトの内容にも問題がある可能性があり、システムがセットアップ時に新しいユーザーアカウントに提供するスケルトンフ X window systemを起動する起動スクリプトは、ウィンドウマネージャを起動する前にユーザー環境変数を設定しようとすると、ユーザーのBash起動スクリプトで驚くべきこ これらの問題は、多くの場合、~/.xsession
~/.xprofile
~/.profile
を読み取ることができます。xtermやGnome端末など、ウィンドウマネージャからBashシェルウィンドウが必要とする環境変数を提供します。
PortabilityEdit
スクリプト内で--posix
オプションを指定してBashを呼び出すか、set -o posix
を指定すると、BashはPOSIX1003.2標準に非常に密接に準拠します。 移植性を目的としたBashシェルスクリプトは、少なくともPOSIXシェル標準を考慮する必要があります。 POSIXにはないいくつかのbash機能は次のとおりです:
- 特定の拡張呼び出しオプション
- ブレース展開
- 配列と連想配列
- 二重括弧
]
拡張テスト構造とその正規表現に一致する - 二重括弧算術評価構造(のみ
$((... パラメータ展開における特定の文字列操作操作
-
ローカル
スコープ変数 - プロセス置換
- Bash固有の組み込み
- コプロセス
- EP EPOCHSECONDSとEP EPOCHREALTIME変数
checkbashisms
とVidar Holenのshellcheck
は、スクリプトにこれらの部分が含まれていないことを確認するために使用できます。 Debianのポリシーでは、スクリプト内のいくつかの拡張機能を許可しています(dash
にあるように)。autoconfのconfigure
のように、POSIX以前のBourneシェルをサポートするスクリプトは、使用できる機能がさらに制限されています。
キーボードショートカット編集
Bashは、readlineを使用して、デフォルト(Emacs)キーバインドを使用してコマンドライン編集のためのキーボードショートカットを提供します。 Viバインディングは、set -o vi
を実行することで有効にできます。
Process managementEdit
Bashシェルには、バッチモードと並行モードの二つのコマンドの実行モードがあります。
バッチで(つまり、シーケンスで)コマンドを実行するには、文字";"で区切るか、別々の行で区切る必要があります。
command1; command2
この例では、command1が終了したときにcommand2が実行されます。
command1のバックグラウンド実行は、実行コマンドの最後に(symbol&)を使用して実行でき、プロセスはバックグラウンドで実行され、すぐにシェルに制御を戻し、コマンドの継続的な実行が可能になります。または、2つのcommand1とcommand2を同時に実行するには、次の方法でBashシェルで実行する必要があります:
command1 & command2
この場合、command1はバックグラウンドで実行されます&シンボル、フォアグラウンドでcommand2を実行するシェルプロセスがフォアグラウンドで実行されている間にCtrl+zと入力することで、プロセスを停止して制御をbashに戻すことができます。
プロセスを停止し、制御をbashに戻すことができます。
バックグラウンドと停止の両方のすべてのプロセスのリストは、jobs
:
$ jobs- Running command1 &+ Stopped command2
出力では、括弧内の数字はジョブidを参照します。 プラス記号は、bg
fg
のデフォルトのプロセスを示します。 "Running"および"Stopped"というテキストは、プロセスの状態を示します。 最後の文字列は、プロセスを開始したコマンドです。
プロセスの状態は、さまざまなコマンドを使用して変更できます。 fg
bg
bg
fg
は、アクションするプロセスを指定するために、最初の引数としてジョブidを取ることができます。 これがなければ、jobs
kill
コマンドを使用すると、シグナルを送信することによってプロセスを途中で終了することができます。 ジョブidはパーセント記号の後に指定する必要があります。
kill %1
Conditional executionEdit
Bashは、先例コマンドによって設定された終了コードに基づ たとえば、次のようにします。
cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2
ここで。/do_somethingは、cd(change directory)コマンドが"successful"(終了ステータスがゼロを返した)場合にのみ実行され、echoコマンドはcdまたはtheのいずれかの場合にのみ実行されます。/do_somethingは、cd(change directory)コマンドが"successful"(終了ステータスがゼロを返した)場合にのみ/do_somethingコマンドは"エラー"(ゼロ以外の終了ステータス)を返します。
すべてのコマンドについて、終了ステータスは特別な変数$?
に格納されます。 Bashはifもサポートしています。..;その後。..;そうでなければ。..;fi
とcase patternのケース$変数)。..;;$other_pattern)。..;;esac
条件付きコマンド評価の形式。
Bug reportingEdit
Bashbugと呼ばれる外部コマンドは、Bashシェルのバグを報告します。 このコマンドが呼び出されると、ユーザーのデフォルトエディタに入力するフォームが表示されます。 フォームはBashメンテナに郵送されます(またはオプションで他の電子メールアドレスに郵送されます)。
プログラマブル補完編集
Bashプログラマブル補完、complete
compgen
コマンドは2のベータ版から利用可能になりました。04年(2000年) これらの機能は、利用可能なプログラムオプションをタブ補完し、ユーザーが次の入力としてファイル名を必要とするオプションを選択した後、次のトークンファイルパスのみを自動補完する(他のオプションはない)など、複雑なインテリジェント補完を可能にする。
Leave a Reply