- 概要
- 説明
- 全体像
- 起動
- 引数リストの処理
- 語彙構造
- クォーティング
- バックスラッシュ
- 一重引用符
- 二重引用符
- 予約語
- エイリアス
- コマンド
- 単純なコマンド
- リダイレクト
- パス検索
- コマンドの終了ステータス
- 複合コマンド
- パイプライン
- バックグラウンドコマンド - &
- リスト – 一般的に
- 短絡リスト演算子
- フロー制御構造 – if、while、for、case
- コマンドのグループ化
- 関数
- 変数とパラメータ
- 位置パラメータ
- 特殊パラメータ
- 単語の展開
- チルダ展開(ユーザーのホームディレクトリの置換)
- パラメータ展開
- コマンド置換
- 算術展開
- 空白分割(フィールド分割)
- パス名展開(ファイル名生成)
- シェルパターン
- ビルトインコマンド
- コマンドライン編集
- 終了ステータス
- 環境
- ファイル
- 関連項目
- 履歴
- バグ
dash — コマンドインタープリタ(シェル)
概要
dash [-aCefnuvxIimqVEbp] [+aCefnuvxIimqVEbp] [-o option_name] [+o option_name]
[command_file [argument ...]]
dash -c [-aCefnuvxIimqVEbp] [+aCefnuvxIimqVEbp] [-o option_name] [+o option_name] command_string
[command_name [argument ...]]
dash -s [-aCefnuvxIimqVEbp] [+aCefnuvxIimqVEbp] [-o option_name] [+o option_name] [argument ...]
説明
dash は、システムの標準コマンドインタープリタです。現在の dash のバージョンは、シェルに関する POSIX 1003.2 および 1003.2a 仕様に準拠するように変更されています。このバージョンには、一部の点で Korn シェルに似た機能が多数ありますが、Korn シェルのクローンではありません([ksh]({filename}../../ksh)(1) を参照)。POSIX で指定された機能と、いくつかの Berkeley 拡張機能のみが、このシェルに組み込まれています。この man ページは、シェルのチュートリアルや完全な仕様を意図したものではありません。
全体像
シェルは、ファイルまたはターミナルから行を読み取り、解釈し、一般的に他のコマンドを実行するコマンドです。ユーザーがシステムにログインすると、シェルが実行されます(ただし、ユーザーは chsh(1) コマンドを使用して、別のシェルを選択できます)。シェルは、フロー制御構造、マクロ機能(データの保存に加えて、さまざまな機能を提供する)、組み込みの履歴および行編集機能を実装する言語です。これは、インタラクティブな使用を支援するための多くの機能を組み込んでおり、解釈言語がインタラクティブな使用と非インタラクティブな使用(シェルスクリプト)の両方で共通であるという利点があります。つまり、コマンドは実行中のシェルに直接入力することも、ファイルに配置してシェルによって直接実行することもできます。
起動
引数がなく、シェルの標準入力がターミナルに接続されている場合(または -i フラグが設定されている場合)、および -c オプションが指定されていない場合、シェルはインタラクティブシェルと見なされます。インタラクティブシェルは、通常、各コマンドの前にプロンプトを表示し、プログラムおよびコマンドエラーを異なる方法で処理します(以下で説明します)。最初に起動するとき、シェルは引数 0 を調べて、それがダッシュ ‘-’ で始まる場合、シェルもログインシェルと見なされます。これは通常、ユーザーが最初にログインするときにシステムによって自動的に行われます。ログインシェルは、最初にファイル /etc/profile と .profile を読み取ります(存在する場合)。環境変数 ENV がインタラクティブシェルへの入力時に設定されているか、ログインシェルの .profile に設定されている場合、シェルは次に、ENV に指定されたファイルからコマンドを読み取ります。したがって、ユーザーは、ログイン時にのみ実行されるコマンドを .profile ファイルに配置し、すべてのインタラクティブシェルで実行されるコマンドを ENV ファイルに配置する必要があります。ENV 変数をあるファイルに設定するには、次の行をホームディレクトリの .profile に配置します。
ENV=$HOME/.shinit; export ENV
“.shinit” の部分を、任意のファイル名に置き換えてください。
コマンドライン引数にオプション以外の引数が指定されている場合、シェルは最初の引数を、読み込むコマンド(シェルスクリプト)を含むファイルの名前として扱い、残りの引数はシェルの位置引数($1、$2など)として設定します。それ以外の場合は、シェルは標準入力からコマンドを読み取ります。
引数リストの処理
単一の文字で表されるオプションのうち、対応する名前を持つオプションは、-o オプションの引数として使用できます。set -o name の形式で、単一の文字で表されるオプションが以下に説明されています。ダッシュ - を指定するとオプションが有効になり、プラス + を指定するとオプションが無効になります。以下のオプションは、コマンドラインまたは set 組み込みコマンド(後述)を使用して設定できます。
-a allexport 割り当てられたすべての変数をエクスポートします。
-c コマンド文字列オペランドからコマンドを読み込み、標準入力からではなく、そのコマンドを実行します。特殊なパラメータ 0 は、コマンド名オペランドから設定され、位置パラメータ($1、$2など)は、残りの引数オペランドから設定されます。
-C noclobber 既存のファイルを `>` で上書きしないようにします。
-e errexit 対話的でない場合、テストされていないコマンドが失敗すると、直ちに終了します。コマンドの終了ステータスは、`if`、`elif`、`while`、または `until` の制御に使用された場合、またはコマンドが `&&` または `||` 演算子の左辺オペランドである場合に、明示的にテストされたと見なされます。
-f noglob パス名展開を無効にします。
-n noexec 対話的でない場合、コマンドを読み取りますが、実行しません。これは、シェルスクリプトの構文をチェックするのに役立ちます。
-u nounset 設定されていない変数を展開しようとしたときに、標準エラーにメッセージを書き出し、シェルが対話的でない場合は、直ちに終了します。
-v verbose シェルは、読み取った入力を標準エラーに出力します。デバッグに役立ちます。
-x xtrace 各コマンドを、実行する前に標準エラーに書き出します(`+` で始まる)。デバッグに役立ちます。
-I ignoreeof 対話的なときに、入力からの EOF を無視します。
-i interactive シェルが対話的に動作するように強制します。
-l シェルがログインシェルとして起動されたかのように動作させます。
-m monitor ジョブコントロールを有効にします(対話的な場合に自動的に有効になります)。
-s stdin 標準入力からコマンドを読み取ります(ファイル引数が存在しない場合に自動的に有効になります)。このオプションは、シェルが実行を開始した後に設定しても効果はありません(`set` を使用)。
-V vi 組み込みの vi(1) コマンドラインエディタを有効にします(-E が設定されている場合は無効になります)。
-E emacs 組み込みの [emacs](filenameemacs.md)(1) コマンドラインエディタを有効にします(-V が設定されている場合は無効になります)。
-b notify バックグラウンドジョブの完了を非同期で通知します。(4.4alpha では未実装)
-p priviliged 実効ユーザーIDがユーザーIDと一致しない場合でも、実効ユーザーIDのリセットを試みません。これは、setuid root プログラムが system(3) または popen(3) を介して誤って使用するのを防ぐために、デフォルトで設定されていません。
語彙構造
シェルは、ファイルから行単位で入力を読み込み、空白(スペースとタブ)およびシェルにとって特別な意味を持つ特定の文字シーケンスである「演算子」で分割します。演算子には、制御演算子とリダイレクト演算子の 2 種類があります(その意味については後述します)。以下に演算子のリストを示します。
制御演算子:
& && ( ) ; ;; | ||
リダイレクト演算子: < > >| << >> <& >& <<- <>
クォーティング
クォーティングは、シェルにとって特別な意味を持つ特定の文字または単語(演算子、空白、またはキーワードなど)の意味を打ち消すために使用されます。クォーティングには、一致する一重引用符、一致する二重引用符、およびバックスラッシュの 3 種類があります。
バックスラッシュ
バックスラッシュは、続く文字の文字通りの意味を保持します(ただし、<newline> は例外です)。バックスラッシュの後に <newline> が続く場合、これは行の継続として扱われます。
一重引用符
一重引用符で囲まれた文字は、すべての文字(一重引用符を除く)の文字通りの意味を保持します(一重引用符で囲まれた文字列に一重引用符を配置することは不可能です)。
二重引用符
二重引用符で囲まれた文字は、ドル記号($)、バッククォート(`)、およびバックスラッシュ(\)を除くすべての文字の文字通りの意味を保持します。二重引用符内のバックスラッシュは、歴史的には少し奇妙で、次の文字のみを引用するために使用されます。
$ ` " \ <newline>。
それ以外の場合は、文字通り解釈されます。
予約語
予約語は、シェルにとって特別な意味を持つ単語であり、行の先頭と制御演算子の後に認識されます。以下の単語が予約語です。
! elif fi while case
else for then { }
do done until if esac
これらの意味については後述します。
エイリアス
エイリアスは、alias(1) 組み込みコマンドを使用して設定される名前と対応する値です。予約語が発生する可能性がある場合(上記参照)、シェルは予約語をチェックした後、単語がエイリアスと一致するかどうかをチェックします。一致する場合、シェルは入力ストリーム内の単語をその値に置き換えます。たとえば、「lf」というエイリアスがあり、その値が「ls -F」の場合、入力は次のようになります。
lf foobar <return>
これは次のようになります。
ls -F foobar <return>
エイリアスは、初心者ユーザーが引数を持つ関数を作成する方法を学習しなくても、コマンドのショートカットを作成するための便利な方法を提供します。また、構文的に難読化されたコードを作成するためにも使用できます。この使用法は推奨されません。
コマンド
シェルは、読み込んだ単語を、POSIX 1003.2ドキュメントに記載されているBNF(文法)に従って、特定の言語で解釈します。このマニュアルページで詳細を説明することはできません。基本的に、シェルは1行を読み込み、その行の最初の単語(または制御演算子の後)が予約語でない場合、シェルはその単語を単純なコマンドとして認識します。それ以外の場合は、複雑なコマンドまたはその他の特殊な構造として認識されます。
単純なコマンド
単純なコマンドが認識された場合、シェルは次のアクションを実行します。
「name=value」の形式の先頭の単語は削除され、単純なコマンドの環境に割り当てられます。リダイレクト演算子とその引数(以下で説明)は削除され、後で使用するために保存されます。
残りの単語は、「展開」セクションで説明されているように展開され、残りの最初の単語はコマンド名と見なされ、コマンドが検索されます。残りの単語は、コマンドの引数と見なされます。コマンド名が見つからなかった場合、アイテム1で認識された「name=value」形式の変数割り当ては、現在のシェルに影響を与えます。
リダイレクトは、次のセクションで説明されているように実行されます。
リダイレクト
リダイレクトは、コマンドが入力の読み込み元または出力の送信先を変更するために使用されます。一般に、リダイレクトは、ファイルへの既存のリファレンスを開いたり、閉じたり、複製したりします。使用される全体的な形式は次のとおりです。
[n] redir-op file
ここで、redir-opは、以前に述べたリダイレクト演算子の1つです。[n]は、'3'('[3]'ではなく)のように、0から9までのオプションの番号で、ファイル記述子を参照します。
[n]> file 標準出力(またはn)をファイルにリダイレクトします。
[n]>| file 同じですが、-Cオプションをオーバーライドします。
[n]>> file 標準出力(またはn)をファイルに追加します。
[n]< file 標準入力(またはn)をファイルからリダイレクトします。
[n1]<&n2 ファイル記述子n2を標準出力(またはfd n1)としてコピーします。fd n2。
[n]<&- 標準入力(またはn)を閉じます。
[n1]>&n2 ファイル記述子n2を標準入力(またはfd n1)としてコピーします。fd n2。
[n]>&- 標準出力を閉じます(またはn)。
[n]<> file 標準入力(またはn)で読み取りおよび書き込みのためにファイルをオープンします。
次のリダイレクトは、通常「ヒアードキュメント」と呼ばれます。
[n]<< delimiter
here-doc-text ...
delimiter
delimiterで指定された行以降の連続する行のすべてのテキストが保存され、コマンドの標準入力または指定されている場合はファイル記述子nとして利用可能になります。初期行で指定されたdelimiterが引用符で囲まれている場合、here-doc-textは文字通りに扱われます。それ以外の場合は、テキストは、パラメータの展開、コマンドの置換、および算術の展開(「展開」セクションで説明されているように)の対象となります。演算子が「<<」ではなく「<<-」の場合、here-doc-textの先頭にあるタブは削除されます。
コマンドには、シェル関数、組み込みコマンド、および通常のプログラムの3種類があり、コマンドは(名前で)その順に検索されます。それぞれ異なる方法で実行されます。
シェル関数が実行されると、シェルのすべての位置パラメータ($0を除く。$0は変更されません)が、シェル関数の引数に設定されます。コマンドの環境に明示的に配置された変数(関数名の前に代入を配置することで)は、関数の ローカル変数となり、与えられた値に設定されます。次に、関数定義に与えられたコマンドが実行されます。位置パラメータは、コマンドが完了すると元の値に復元されます。これらはすべて現在のシェル内で行われます。
シェル組み込みコマンドは、新しいプロセスを生成することなく、シェル内で内部的に実行されます。
それ以外の場合、コマンド名が関数または組み込みコマンドと一致しない場合、コマンドはファイルシステム内の通常のプログラムとして検索されます(次のセクションで説明)。通常のプログラムが実行されると、シェルはプログ
ラムを呼び出し、引数と環境をプログラムに渡します。プログラムが通常の実行可能ファイルでない場合(つまり、「#!」というASCII表現で始まるマジックナンバーで始まらない場合)、execve(2)がENOEXECを返すため、シェル
はプログラムをサブシェルで解釈します。この場合、子シェルは自身を再初期化するため、結果として、アドホックなシェルスクリプトを処理するために新しいシェルが呼び出された場合と同じになります。ただし、親シェルに位置
するハッシュ化されたコマンドの位置は、子シェルによって記憶されます。
このドキュメントの以前のバージョンとソースコード自体には、マジックナンバーのないシェルスクリプトを「シェルプロシージャ」と誤って断続的に参照している箇所があります。
パス検索
コマンドを特定する場合、シェルはまず、その名前のシェル関数があるかどうかを確認します。次に、同じ名前の組み込みコマンドを検索します。組み込みコマンドが見つからない場合、次のいずれかの処理が行われます。
- スラッシュを含むコマンド名は、検索を行わずに単純に実行されます。
- シェルは、PATH内の各エントリを順番に検索して、コマンドを探します。PATH変数の値は、コロンで区切られた一連のエントリである必要があります。各エントリは、ディレクトリ名で構成されます。現在のディレクトリは、空 のディレクトリ名によって暗黙的に、または単一のドットによって明示的に示すことができます。
コマンドの終了ステータス
各コマンドには、他のシェルのコマンドの動作に影響を与える可能性のある終了ステータスがあります。パラダイムは、コマンドが正常または成功の場合はゼロで終了し、失敗、エラー、または偽のインジケーターの場合はゼロ以外 の値で終了することです。各コマンドのmanページには、さまざまな終了コードとその意味が表示される必要があります。さらに、組み込みコマンドと実行されたシェル関数も終了コードを返します。
コマンドが完全に変数代入のみで構成されている場合、コマンドの終了ステータスは、コマンド置換が存在する場合はそのコマンド置換の終了ステータスとなり、そうでない場合は0になります。
複合コマンド
複合コマンドは、制御演算子または予約語と組み合わせた単純コマンドであり、より大きな複合コマンドを作成します。より一般的に、コマンドは次のいずれかです。
- 単純コマンド
- パイプライン
- リストまたは複合リスト
- 複合コマンド
- 関数定義
特に明記されていない限り、コマンドの終了ステータスは、コマンドによって実行された最後の単純コマンドの終了ステータスです。
パイプライン
パイプラインは、制御演算子|で区切られた1つ以上のコマンドのシーケンスです。最後のコマンドを除くすべてのコマンドの標準出力は、次のコマンドの標準入力に接続されます。最後のコマンドの標準出力は、通常どおりシェルか ら継承されます。
パイプラインの形式は次のとおりです。
[!] command1 [| command2 ...]
command1の標準出力は、command2の標準入力に接続されます。パイプラインのコマンドの標準入力、標準出力、またはその両方は、コマンドの一部であるリダイレクト演算子によって指定されたリダイレクトによって変更できますが 、パイプラインによって割り当てられたものと見なされます。
パイプラインがバックグラウンドで実行されていない場合(後述)、シェルはすべてのコマンドが完了するまで待ちます。
シェルがパイプラインの実行を開始したときにpipefailオプションが有効になっている場合、パイプラインの終了ステータスは、パイプライン内でゼロ以外のステータスで終了した最後のコマンドの終了ステータスとなり、すべての コマンドがゼロのステータスで終了した場合はゼロになります。pipefailオプションが有効になっていない場合、パイプラインの終了ステータスは、パイプライン内で指定された最後のコマンドの終了ステータスになります。他のコ マンドの終了ステータスは使用されません。予約語!がパイプラインの前に付いている場合、その終了ステータスは、上記で説明した終了ステータスの論理否定になります。
パイプラインによる標準入力または標準出力、またはその両方の割り当ては、リダイレクトの前に行われるため、リダイレクトによって変更できます。たとえば、次のようになります。
$ command1 2>&1 | command2
これにより、command1の標準出力と標準エラーの両方が、command2の標準入力に送信されます。
^ `または⟨newline⟩ターミネータは、先行するAND-ORリスト(次に説明)を順番に実行します。&`は、先行するAND-ORリストを非同期的に実行します。
他のシェルとは異なり、パイプライン内の各プロセスは、呼び出し元のシェルの子であることに注意してください(ただし、シェル組み込みコマンドの場合は、現在のシェルで実行され、環境に与える影響はクリアされます)。
バックグラウンドコマンド - &
コマンドが制御演算子アンパサンド(&)で終了する場合、シェルはそのコマンドを非同期的に実行します。つまり、シェルはコマンドが完了するまで待機してから、次のコマンドを実行しません。
バックグラウンドでコマンドを実行する形式は次のとおりです。
command1 & [command2 & ...]
非対話的なシェルで非同期コマンドの標準入力は、/dev/null に設定されます。
リスト – 一般的に
リストは、改行、セミコロン、またはアットマーク (&) で区切られた、ゼロ個以上のコマンドのシーケンスです。オプションで、これらの3つの文字のいずれかで終了します。リスト内のコマンドは、記述されている順に実行されます。コマンドの後にアットマーク (&) が続く場合、シェルはそのコマンドを開始し、直ちに次のコマンドに進みます。それ以外の場合は、シェルはそのコマンドが終了するまで待ち、それから次のコマンドに進みます。
短絡リスト演算子
“&&” および “||” は、AND-OR リスト演算子です。“&&” は、最初に最初のコマンドを実行し、次に最初のコマンドの終了ステータスがゼロの場合にのみ、2番目のコマンドを実行します。“||” は似ていますが、最初のコマンドの終了ステータスがゼロでない場合にのみ、2番目のコマンドを実行します。“&&” と “||” はどちらも同じ優先度を持ちます。
フロー制御構造 – if、while、for、case
if コマンドの構文は次のとおりです。
if リスト
then リスト
[ elif リスト
then リスト ] ...
[ else リスト ]
fi
while コマンドの構文は次のとおりです。
while リスト
do リスト
done
2つのリストは、最初のリストの終了ステータスがゼロである間、繰り返し実行されます。until コマンドは似ていますが、while の代わりに until という単語を使用し、最初のリストの終了ステータスがゼロになるまで繰り返します。
for コマンドの構文は次のとおりです。
for 変数 [ in [ 単語 ... ] ]
do リスト
done
in の後の単語は展開され、次にリストは、変数が順番に各単語に設定されて、繰り返し実行されます。in 単語 ... を省略することは、in "$@" と同等です。
break コマンドと continue コマンドの構文は次のとおりです。
break [ ヌ]
continue [ ヌ]
break は、ヌ 個の最も内側の for または while ループを終了します。continue は、最も内側のループの次の反復に進みます。これらは、組み込みコマンドとして実装されます。
case コマンドの構文は次のとおりです。
case 単語 in
[(]パターン) リスト ;;
...
esac
パターンは実際には、"|" 文字で区切られた 1つ以上のパターンにすることができます。パターンの前の "(" 文字はオプションです。
コマンドのグループ化
コマンドは、次のように記述することでグループ化できます。
(リスト)
または
{ リスト; }
最初の形式は、コマンドをサブシェルで実行します。 (リスト) にグループ化された組み込みコマンドは、現在のシェルに影響を与えません。2番目の形式は別のシェルをフォークしないため、わずかに効率的です。コマンドをこのようにグループ化することで、それらの出力を1つのプログラムであるかのようにリダイレクトできます。
{ printf " hello " ; printf " world\n" ; } > greeting
"}" は、制御演算子の後に続くため、予約語として認識され、別のコマンド引数として解釈されないことに注意してください。
関数
関数定義の構文は次のとおりです。
name () コマンド
関数定義は実行可能なステートメントです。実行すると、name という名前の関数がインストールされ、ゼロの終了ステータスが返されます。コマンドは通常、"{ " と "}" で囲まれたリストです。
変数を関数のローカル変数として宣言するには、local コマンドを使用します。これは関数の最初のステートメントとして表示され、構文は次のとおりです。
local [変数 | -] ...
^ ocal は、組み込みコマンドとして実装されます。
変数をローカルにすると、同じ名前の変数が周囲のスコープに存在する場合は、その変数の初期値、エクスポート済みフラグ、および読み取り専用フラグが継承されます。そうでない場合、変数は最初に未設定になります。シェルは動的スコープを使用するため、関数 f に変数 x をローカルに設定し、f が関数 g を呼び出す場合、g 内で行われる変数 x への参照は、グローバル変数 x ではなく、f 内で宣言された変数 x を参照します。
ローカルにできる唯一の特殊なパラメータは「-」です。local コマンドで「-」をローカルにすると、関数内で set コマンドを使用して変更されたすべてのシェルオプションが、関数が終了するときに元の値に復元されます。
^ eturn コマンドの構文は次のとおりです。
return [終了ステータス]
現在実行中の関数を終了します。Return は、組み込みコマンドとして実装されます。
変数とパラメータ
シェルは、一連のパラメータを保持します。名前で表されるパラメータは変数と呼ばれます。起動時に、シェルはすべての環境変数をシェル変数に変換します。新しい変数は、次の形式を使用して設定できます。
名前=値
ユーザーが設定する変数は、英字、数字、およびアンダースコアのみで構成される必要があり、最初の文字が数字であってはなりません。パラメータは、数値または以下に示す特殊文字でも表すことができます。
位置パラメータ
位置パラメータは、番号 (n > 0) で表されるパラメータです。シェルは、これらのパラメータを初期状態で、シェルスクリプト名の後に続くコマンドライン引数の値に設定します。set 組み込みコマンドを使用して、これらのパラメータを設定またはリセットすることもできます。
特殊パラメータ
特殊パラメータは、次の特殊文字のいずれかで表されるパラメータです。パラメータの値は、その文字の横にリストされています。
* 位置パラメータを 1 から開始して展開します。展開が二重引用符で囲まれた文字列内で発生する場合、各パラメータの値が `IFS` 変数の最初の文字、または `IFS` が未設定の場合はスペースで区切られた単一のフィールドに展開されます。
@ 位置パラメータを 1 から開始して展開します。展開が二重引用符で囲まれた文字列内で発生する場合、各位置パラメータは別個の引数として展開されます。位置パラメータがない場合、`@` の展開はゼロ個の引数を生成します。たとえば、`$1` が「abc」で `$2` が「def ghi」の場合、`"$@"` は 2 つの引数に展開されます。
"abc" "def ghi"
# 位置パラメータの数を展開します。
? 最も最近のパイプラインの終了ステータスに展開されます。
- (ハイフン) 起動時に、`set`組み込みコマンドによって、またはシェルによって暗黙的に指定された、現在のオプションフラグ(単一文字のオプション名の連結)を文字列として展開します。
$ 呼び出されたシェルのプロセスIDに展開されます。サブシェルは、親シェルと同じ`$`の値を保持します。
! 現在のシェルから実行された最も最近のバックグラウンドコマンドのプロセスIDに展開されます。パイプラインの場合、プロセスIDは、パイプラインの最後のコマンドのプロセスIDです。
0(ゼロ) シェルまたはシェルスクリプトの名前に展開されます。
単語の展開
この句は、単語に対して実行されるさまざまな展開について記述します。すべての展開がすべての単語に対して実行されるわけではありません。これは後で説明します。
チルダ展開、パラメータ展開、コマンド置換、算術展開、および単一の単語内で発生する引用符の削除は、単一のフィールドに展開されます。フィールド分割またはパス名展開によってのみ、単一の単語から複数のフィールドを作成できます。この規則の唯一の例外は、前述のように、二重引用符内の特殊パラメータ@の展開です。
単語の展開の順序は次のとおりです。
チルダ展開、パラメータ展開、コマンド置換、算術展開(これらはすべて同時に発生します)。
ステップ(1)で生成されたフィールドに対して、IFS変数がnullでない限り、フィールド分割が実行されます。
パス名展開(`set -f`が有効でない場合)。
引用符の削除。
^ ``文字は、パラメータ展開、コマンド置換、または算術評価を導入するために使用されます。
チルダ展開(ユーザーのホームディレクトリの置換)
チルダ文字(~)で始まる単語は、チルダ展開を受けます。スラッシュ(/)または単語の末尾までのすべての文字がユーザー名として扱われ、ユーザーのホームディレクトリに置き換えられます。ユーザー名が欠落している場合(~/foobarなど)、チルダは、HOME変数の値(現在のユーザーのホームディレクトリ)に置き換えられます。
パラメータ展開
パラメータ展開の形式は次のとおりです。
${式}
ここで、式は、対応する}までのすべての文字で構成されます。バックスラッシュでエスケープされた、または引用符で囲まれた文字列内の}、および埋め込まれた算術展開、コマンド置換、および変数展開内の文字は、対応する}を決定するために調べられません。
パラメータ展開の最も簡単な形式は次のとおりです。
${パラメータ}
パラメータの値(存在する場合)が置換されます。
パラメータ名を中括弧で囲むことができます。これはオプションですが、1桁より多くの桁数を持つ位置パラメータの場合、またはパラメータが名前の一部として解釈される可能性のある文字の後に続く場合は必要です。パラメータ展開が二重引用符内で発生する場合:
展開結果に対してパス名展開は実行されません。
フィールド分割は、拡張の結果に対しては実行されません。ただし、@ の場合は例外です。
さらに、パラメータ拡張は、次のいずれかの形式を使用して変更できます。
${parameter:-word} デフォルト値を使用します。パラメータが未設定または null の場合、word の展開が代入されます。それ以外の場合は、パラメータの値が代入されます。
${parameter:=word} デフォルト値を割り当てます。パラメータが未設定または null の場合、word の展開がパラメータに代入されます。すべてのケースで、パラメータの最終的な値が代入されます。この方法は、変数でのみ使用でき、位置パラメータまたは特殊パラメータでは使用できません。
${parameter:?[word]} null または未設定の場合にエラーを示します。パラメータが未設定または null の場合、word の展開(または word が省略された場合は、未設定であることを示すメッセージ)が標準エラーに出力され、シェルは 0 以外の終了ステータスで終了します。それ以外の場合は、パラメータの値が代入されます。対話型シェルでは、必ずしも終了する必要はありません。
${parameter:+word} 代替値を使用します。パラメータが未設定または null の場合、null が代入されます。それ以外の場合は、word の展開が代入されます。
上記のパラメータ拡張では、形式でコロンを使用すると、未設定または null のパラメータに対してテストが行われ、コロンを省略すると、未設定のパラメータに対してのみテストが行われます。
${#parameter} 文字列の長さ。パラメータの値の文字数。
次の 4 つの種類のパラメータ拡張は、部分文字列の処理を提供します。各ケースで、正規表現表記ではなく、シェルパターン表記を使用してパターンを評価します。パラメータが * または @ の場合、拡張の結果は未定義です。完全なパラメータ拡張文字列を二重引用符で囲んでも、次の 4 種類のパターン文字は引用符で囲まれませんが、中括弧内の引用符は、この効果をもたらします。
${parameter%word} 最小のサフィックスパターンを削除します。word は展開されてパターンになります。パラメータ拡張では、パラメータから、パターンと一致する最小のサフィックス部分が削除された結果が得られます。
${parameter%%word} 最大のサフィックスパターンを削除します。word は展開されてパターンになります。パラメータ拡張では、パラメータから、パターンと一致する最大のサフィックス部分が削除された結果が得られます。
${parameter#word} 最小のプレフィックスパターンを削除します。word は展開されてパターンになります。パラメータ拡張では、パラメータから、パターンと一致する最小のプレフィックス部分が削除された結果が得られます。
${parameter##word} 最大のプレフィックスパターンを削除します。word は展開されてパターンになります。パラメータ拡張では、パラメータから、パターンと一致する最大のプレフィックス部分が削除された結果が得られます。
コマンド置換
コマンド置換を使用すると、コマンドの出力を、コマンド名自体を置き換える位置に代入できます。コマンド置換は、コマンドを次のように囲むことで実行されます。
$(command)
または(バッククォート形式):
\`command\`
シェルは、コマンドをサブシェル環境で実行し、コマンド置換をコマンドの標準出力に置き換えることで、コマンド置換を拡張します。末尾にある 1 つ以上の改行シーケンスは削除されます。(出力の途中にある埋め込まれた改行は削除されませんが、フィールド分割中には、IFS の値と適用されている引用符に応じて、スペースに変換される場合があります。)
算術展開
算術展開は、算術式を評価し、その値を置換するためのメカニズムを提供します。算術展開の形式は次のとおりです。
$((expression))
この式は、ダブルクォートで囲まれたかのように扱われます。ただし、式の内部にあるダブルクォートは特別な意味を持ちません。シェルは、式のすべてのトークンをパラメーター展開、コマンド置換、引用符の削除に対して拡張します。
次に、シェルはこれを算術式として扱い、式の値を置換します。
空白分割(フィールド分割)
パラメーター展開、コマンド置換、および算術展開の後、シェルはダブルクォートで囲まれていなかった拡張および置換の結果をスキャンし、フィールド分割を実行します。その結果、複数のフィールドが生じる可能性があります。
シェルは、IFS の各文字を区切り文字として扱い、パラメーター展開とコマンド置換の結果を区切り文字で分割して、フィールドを作成します。
パス名展開(ファイル名生成)
-f フラグが設定されていない限り、ファイル名生成はワード分割が完了した後に実行されます。各ワードは、スラッシュで区切られた一連のパターンとして扱われます。展開のプロセスでは、ワードが、各パターンを一致する文字列に置き換えて形成できる既存のすべてのファイルの名前に置き換えられます。これには 2 つの制限があります。1 つ目は、パターンがスラッシュを含む文字列に一致することはできず、2 つ目は、パターンがピリオドで始まる文字列に一致することもできません(パターンの最初の文字がピリオドである場合を除く)。次のセクションでは、パス名展開と case コマンドで使用されるパターンについて説明します。
シェルパターン
パターンは、一致する通常の文字とメタ文字で構成されます。メタ文字は、「!」「*」「?」、および「[」です。これらの文字は、引用符で囲まれている場合は、特別な意味を失います。コマンドまたは変数置換が実行され、ドル記号またはバッククォートがダブルクォートで囲まれていない場合、変数の値またはコマンドの出力はこれらの文字に対してスキャンされ、メタ文字に変換されます。
アスタリスク(「*」)は、任意の文字列に一致します。疑問符は、任意の 1 文字に一致します。左角括弧(「[」)は、文字クラスを導入します。文字クラスの終わりは、右角括弧(「]」)で示されます。右角括弧が欠落している場合、「[」は文字クラスを導入するのではなく、「[」に一致します。文字クラスは、角括弧の間の文字に一致します。ハイフンを使用して、文字の範囲を指定できます。感嘆符を文字クラスの最初の文字にすることで、文字クラスを補完できます。
文字クラスに「]」を含めるには、最初に(「!」の後に)リストします。ハイフンを含めるには、リストの最初または最後に配置します。
ビルトインコマンド
このセクションでは、個別のプロセスでは実行できない操作を実行する必要があるため、ビルトインコマンドとして実装されているコマンドをリストします。これらに加えて、効率のためにビルトインとして実装されている他のコマンドもいくつかあります(例:printf(1)、echo(1)、test(1)など)。
:
true 終了ステータス 0(真)を返す、何もしないコマンド。
false 終了ステータス 1(偽)を返す、何もしないコマンド。
. file 指定されたファイル内のコマンドを読み込み、シェルで実行します。
alias [name[=string ...]] name=string が指定された場合、シェルは name を string の値を持つエイリアスとして定義します。name のみが指定された場合、エイリアスの値が出力されます。引数なしで呼び出した場合、定義されているすべてのエイリアスの名前と値が出力されます(unalias を参照)。
bg [job] ... 指定されたジョブ(または引数が指定されていない場合は現在のジョブ)をバックグラウンドで続行します。
command [-p] [-v] [-V] command [arg ...] 指定されたコマンドを実行しますが、シェル関数は検索対象から除外します(これは、シェル関数と同じ名前のビルトインコマンドがある場合に役立ちます)。
-p PATH を使用してコマンドを検索し、すべての標準ユーティリティが見つかるようにします。
-V コマンドを実行せずに、コマンドを検索し、コマンド検索の解決方法を出力します。これは type ビルトインコマンドと同じです。
-v コマンドを実行せずに、コマンドを検索し、ユーティリティの絶対パス名、ビルトインコマンドの名前、またはエイリアスの展開を出力します。
cd|chdir cd|chdir [-LP] [directory] 指定されたディレクトリ(デフォルトは HOME)に移動します。cd コマンドの環境に CDPATH エントリが含まれているか、シェル変数 CDPATH が設定されており、ディレクトリ名がスラッシュで始まらない場合、CDPATH にリストされているディレクトリが、指定されたディレクトリに対して検索されます。CDPATH の形式は PATH と同じです。引数として単一のダッシュが指定された場合、OLDPWD の値に置き換えられます。cd コマンドは、実際に切り替えたディレクトリの名前を出力します。これは、ユーザーが指定した名前と異なる場合があります。これは、CDPATH メカニズムが使用されたか、引数が単一のダッシュであるために発生する可能性があります。-P オプションは、物理的なディレクトリ構造を使用するように指定します。つまり、すべてのシンボリックリンクが対応する値に解決されます。-L オプションは、先行する -P オプションの効果をオフにします。
echo [-n] 引数...
引数を標準出力にスペースで区切って出力します。-n オプションが指定されていない場合、引数の後に改行が出力されます。
出力中に次の文字シーケンスのいずれかが検出された場合、そのシーケンスは出力されません。代わりに、指定されたアクションが実行されます。
\b バックスペース文字を出力します。
\c 後続の出力は抑制されます。これは通常、最後の引数の末尾で使用され、echo が出力する可能性のある末尾の改行を抑制します。
\e エスケープ文字(ESC)を出力します。
\f フォームフィードを出力します。
\n 改行文字を出力します。
\r キャリッジリターンを出力します。
\t (水平)タブ文字を出力します。
\v 垂直タブを出力します。
\0数字
0〜3桁の8進数で指定された値を持つ文字を出力します。数字がない場合は、ヌル文字が出力されます。
\\ バックスラッシュを出力します。
他のバックスラッシュシーケンスは、未定義の動作を引き起こします。
eval 文字列 ...
すべての引数をスペースで連結します。次に、再解析してコマンドを実行します。
exec [コマンド 引数 ...]
コマンドが指定されていない場合、シェルプロセスは指定されたプログラムに置き換えられます(これは、シェル組み込みコマンドまたは関数ではなく、実際のプログラムである必要があります)。exec コマンドのすべてのリダイレクトは永続的にマークされ、exec コマンドが終了したときに元に戻されません。
exit [終了ステータス]
シェルプロセスを終了します。終了ステータスが指定されている場合は、シェルの終了ステータスとして使用されます。それ以外の場合は、先行するコマンドの終了ステータスが使用されます。
export 名前 ...
export -p
指定された名前はエクスポートされ、後続のコマンドの環境に表示されるようになります。変数をエクスポート解除する唯一の方法は、変数をunsetすることです。シェルは、export 名前=値 のように、変数の値を設定すると同時にエクスポートすることを許可します。
引数がない場合、export コマンドは、エクスポートされたすべての変数の名前をリストします。-p オプションが指定されている場合、出力は非対話型で使用するのに適した形式になります。
fc [-e エディター] [最初 [最後]]
fc -l [-nr] [最初 [最後]]
fc -s [古い=新しい] [最初]
fc 組み込みコマンドは、インタラクティブシェルに以前に入力されたコマンドをリストしたり、編集して再実行したりします。
-e エディター
エディターで指定されたエディターを使用して、コマンドを編集します。エディター文字列は、PATH変数で検索されるコマンド名です。-e が指定されていない場合、FCEDIT 変数の値がデフォルトとして使用されます。FCEDIT が null または設定されていない場合、EDITOR 変数の値が使用されます。EDITOR が null または設定されていない場合、ed(1) がエディターとして使用されます。
-l (ell)
コマンドをリストし、エディターを呼び出さないようにします。コマンドは、-r によって影響を受ける、最初と最後のオペランドで指定された順序で書き込まれ、各コマンドの前にコマンド番号が付けられます。
-n -l オプションでリスト表示する際にコマンド番号を抑制します。
-r -l オプションでリスト表示する場合、または -l オプションと -s オプションのどちらも使用しない場合に、リスト表示または編集するコマンドの順序を反転します。
-s エディターを起動せずに、コマンドを再実行します。
first
last リスト表示または編集するコマンドを選択します。アクセスできる以前のコマンドの数は、HISTSIZE 変数の値によって決まります。first または last、またはその両方の値は、次のいずれかになります。
[+]number
正の数で、コマンド番号を表します。コマンド番号は -l オプションで表示できます。
-number
負の10進数で、実行されたコマンドの数を示します。たとえば、-1 は直前のコマンドです。
string
文字列で、最近入力されたコマンドのうち、その文字列で始まるコマンドを示します。old=new オペランドも -s オプションと一緒に指定されていない場合、文字列形式の first オペランドには埋め込みの等号を含めることはできません。
次の環境変数が fc の実行に影響します。
FCEDIT 使用するエディターの名前。
HISTSIZE アクセスできる以前のコマンドの数。
fg [job]
指定されたジョブ、または現在のジョブをフォアグラウンドに移動します。
getopts optstring var [arg ...]
POSIX getopts コマンド。Bell Labs 由来の getopt(1) と混同しないでください。
最初の引数は、文字のシーケンスである必要があります。各文字の後に、オプションでコロンを付けて、オプションに引数が必要であることを示すことができます。指定された変数は、解析されたオプションに設定されます。
getopts コマンドは、空白を含む引数の処理方法が異なるため、古い getopt(1) ユーティリティを非推奨にします。
getopts 組み込みコマンドを使用して、パラメーターのリストからオプションとその引数を得ることができます。呼び出されると、getopts は、リスト内の次のオプションの値を、var で指定されたシェル変数に配置し、そのインデックスをシェル変数 OPTIND に配置します。シェルが呼び出されると、OPTIND は 1 に初期化されます。引数が必要なオプションの場合、getopts 組み込みコマンドは、その引数をシェル変数 OPTARG に配置します。オプションが optstring で許可されていない場合、OPTARG は未定義になります。
デフォルトでは、$1、...、$n が検査されます。args が指定されている場合は、代わりにそれらが解析されます。
optstring は、認識されているオプション文字の文字列です (getopt(3) を参照)。文字の後にコロンが続く場合、オプションには引数が必要であり、引数は空白によってオプションから分離されている場合とそうでない場合があります。予想される場所にオプション文字が見つからない場合、getopts は変数 var を「?」に設定し、OPTARG を未定義にし、標準エラーに出力します。optstring の最初の文字としてコロンを指定すると、すべてのエラーが無視されます。
最後のオプションの後、getopts はゼロ以外の値を返し、var を「?」に設定します。
次のコードフラグメントは、[a] と [b] のオプションと、引数が必要な [c] オプションを受け入れることができるコマンドの引数を処理する方法を示しています。
while getopts abc: f
do
case $f in
a | b) flag=$f;;
c) carg=$OPTARG;;
\?) echo $USAGE; exit 1;;
esac
done
shift $((OPTIND - 1))
このコードは、以下のいずれかを同等として受け入れます。
cmd -acarg file file
cmd -a -c arg file file
cmd -carg -a file file
cmd -a -carg -- file file
hash [command ...]
hash -r
シェルは、コマンドの場所を記憶するハッシュテーブルを維持します。引数なしで実行すると、このテーブルの内容が出力されます。最後に cd コマンドが実行されてから参照されていないエントリにはアスタリスクが付けられ、これらのエントリが無効になる可能性があります。
引数とともに実行すると、hash コマンドは指定されたコマンドをハッシュテーブルから削除します(ただし、関数は除く)。その後、コマンドを検索します。-r オプションは、hash コマンドにハッシュテーブル内のすべてのエントリ(関数を除く)を削除させます。
jobs [-lp] [job ...]
すべてのジョブ、または指定されたジョブのステータスを表示します。
デフォルトでは、ジョブ番号、現在のステータス(+または-)、ジョブの状態、およびシェルコマンドが表示されます。
^ l: グループリーダーのPIDと、他のジョブメンバーのPIDとシェルコマンドも出力します。
^ p: グループリーダーのPIDのみを1行に1つずつ表示します。
kill [-s sigspec | -signum | -sigspec] [pid | job ...]
kill(1) と同じですが、ジョブ指定も可能です。シグナルは、SIG プレフィックスなしのケースインセンシティブな名前、または10進数で指定できます。デフォルトは TERM です。
kill -l [signum | exitstatus]
利用可能なシグナル名を SIG プレフィックスなしで一覧表示します。signum が指定されている場合は、そのシグナルのシグナル名のみを表示します。exitstatus が指定されている場合(128より大きい)、そのシグナルによって発生したシグナル名のみを表示します。
pwd [-LP]
組み込みコマンドは、現在のディレクトリを記憶し、毎回再計算しません。これにより、処理速度が向上します。ただし、現在のディレクトリが名前変更された場合、組み込みバージョンの pwd は、ディレクトリの古い名前を引き続き出力します。-P オプションは、物理的な現在の作業ディレクトリを表示します。つまり、すべてのシンボリックリンクが対応する値に解決されます。-L オプションは、先行する -P オプションの効果をオフにします。
read [-p prompt] [-r] variable [...]
^ p オプションが指定され、標準入力がターミナルである場合、プロンプトが出力されます。その後、標準入力から1行が読み込まれます。行末の改行が削除され、行は上記の「ワード分割」のセクションで説明されているように分割され、結果が順に変数に割り当てられます。少なくとも1つの変数が必要です。ピースの数が変数の数より多い場合、残りのピース(およびそれらを区切る IFS 内の文字)は最後の変数に割り当てられます。変数の数がピースの数より多い場合、残りの変数は空の文字列に割り当てられます。read 組み込みコマンドは、入力でEOFが発生した場合に失敗を返し、それ以外の場合は成功を示します。
デフォルトでは、-r オプションが指定されていない限り、バックスラッシュ「\」はエスケープ文字として機能し、次の文字が文字通りに解釈されます。バックスラッシュの後に改行が続く場合、バックスラッシュと改行は削除されます。
readonly name ...
readonly -p
指定された名前は読み取り専用としてマークされ、後で変更または設定解除できなくなります。シェルでは、変数の値を読み取り専用としてマークする際に、同時に値を設定することができます。
readonly name=value
引数なしで readonly コマンドを使用すると、すべての読み取り専用変数の名前がリストされます。-p オプションが指定された場合、出力は非対話型で使用できるようにフォーマットされます。
printf format [value]...
^ rintf は、format に従って引数をフォーマットして出力します。format は、プレーン文字、文字エスケープシーケンス、およびフォーマット指定子の 3 種類のオブジェクトを含む文字列です。プレーン文字は標準出力にコピーされるだけで、文字エスケープシーケンスは変換されて標準出力にコピーされ、各フォーマット指定子は次の値の印刷を引き起こします。
各値は、対応するフォーマット指定子が b、c、または s のいずれかである場合は、文字列として扱われます。それ以外の場合は、C 定数として評価されます。また、次の追加があります。
先頭にプラスまたはマイナスの符号が付いていても構いません。 先頭の文字がシングルクォートまたはダブルクォートの場合、次のバイトの値が出力されます。
フォーマット文字列は、すべての値が使い果たされるまで、必要な回数だけ再利用されます。余分なフォーマット指定子がある場合は、ゼロまたはヌル文字列で評価されます。
文字エスケープシーケンスは、ANSI X3.159-1989(「ANSI C89」)で定義されているバックスラッシュ表記です。文字とその意味は次のとおりです。
\a ベル文字を出力します。
\b バックスペース文字を出力します。
\e エスケープ(ESC)文字を出力します。
\f フォームフィード文字を出力します。
\n 改行文字を出力します。
\r キャリッジリターン文字を出力します。
\t タブ文字を出力します。
\v 垂直タブ文字を出力します。
\\ バックスラッシュ文字を出力します。
\num ASCII 値が 1 桁、2 桁、または 3 桁の 8 進数 `num` である 8 ビット文字を出力します。
各フォーマット指定子は、パーセント文字(%)で始まります。フォーマット指定子の残りの部分には、次の順序で次のフラグが 0 個以上含まれます。
`#` 文字は、値が「代替形式」で出力されることを指定します。`b`、`c`、`d`、および `s` のフォーマットでは、このオプションは効果がありません。`o` フォーマットの場合、数値の精度が向上し、出力文字列の最初の文字がゼロになります。`x`(`X`)フォーマットの場合、ゼロでない結果の先頭に文字列 `0x`(`0X`)が付けられます。`e`、`E`、`f`、`g`、および `G` フォーマットの場合、結果には常に小数点が含まれ、小数点に数字が続かない場合でも同様です。`g` および `G` フォーマットの場合、結果から末尾のゼロが削除されなくなります。
- 出力文字列を指定されたフィールド内で左揃えにするためのマイナス記号 `-'。
+ 符号付き形式を使用する場合、常に数値の前に符号を配置する必要があることを示す `+' 文字。
‘ ’ 空白を指定し、符号付き形式の場合、正の数値の前に空白を挿入します。`+' が使用されている場合、空白は上書きされます。
0 ゼロ埋めを使用する代わりに空白埋めを使用することを示すゼロ `0` 文字。`-' が使用されている場合、`0` は上書きされます。
フィールド幅: オプションの数字文字列で、フィールド幅を指定します。出力文字列の文字数がフィールド幅より少ない場合、左揃え (または左揃えインジケーターが指定されている場合は右揃え) に空白で埋められて、フィールド幅が調整されます (先頭のゼロはフラグですが、埋め込まれたゼロはフィールド幅の一部です)。
精度:
オプションのピリオド . の後に、オプションの数字文字列が続き、精度を指定します。これは、e および f 形式の場合の小数点以下の桁数、または b および s 形式の場合の文字列から出力する最大バイト数を指定します。数字文字列が欠落している場合、精度はゼロとして扱われます。
形式: 使用する形式の種類を示す文字 (diouxXfwEgGbcs のいずれか)。
フィールド幅または精度を数字文字列の代わりに \* を使用することができます。この場合、引数でフィールド幅または精度が指定されます。
形式文字とその意味は次のとおりです。
diouXx 引数は、符号付き 10 進数 (d または i)、符号なし 8 進数、符号なし 10 進数、または符号なし 16 進数 (X または x) として出力されます。
f 引数は、`[-]ddd.ddd` の形式で出力されます。ここで、小数点以下の `d` の数は、引数の精度指定に等しくなります。精度が指定されていない場合、6 桁が表示されます。精度が明示的に 0 の場合、桁も小数点も表示されません。
eE 引数は、`[-]d.ddde±dd` の形式で出力されます。ここで、小数点より前の桁数は 1 桁であり、小数点より後の桁数は、引数の精度指定に等しくなります。精度が指定されていない場合、6 桁が表示されます。大文字の `E` は `E` 形式で使用されます。
gG 引数は、`f` 形式または `e` (または `E`) 形式で出力されます。どちらの形式を使用するかは、可能な限り少ないスペースで、最大限の精度が得られるように決定されます。
b 文字列引数の文字は、バックスラッシュエスケープシーケンスが展開されて出力されます。次の追加のバックスラッシュエスケープシーケンスがサポートされます。
\c ダッシュは、それを含む文字列オペランドの残りの文字、残りの文字列オペランド、および形式オペランドの追加の文字をすべて無視します。
\0num 1桁、2桁、または3桁の8進数である数値 num に対応するASCII値を持つ8ビット文字を出力します。
c 引数の最初の文字を出力します。
s 文字列引数から文字を出力し、文字列の終わりまたは指定された精度で示されるバイト数に達するまで出力します。精度が省略された場合、文字列内のすべての文字が出力されます。
% '%' を出力します。引数は使用しません。
いかなる場合も、存在しない、または小さいフィールド幅がフィールドの切り捨てを引き起こすことはありません。パディングは、指定されたフィールド幅が実際の幅を超える場合にのみ行われます。
set [{ -options | +options | -- }] arg ...
set コマンドは、3つの異なる機能を実行します。
引数なしで、すべてのシェル変数の値をリストします。
オプションが与えられた場合、指定されたオプションフラグを設定するか、Argument List Processing のセクションで説明されているようにクリアします。特別なケースとして、オプションが -o または +o で、引数が指定されていない場合、シェルはすべてのオプションの設定を出力します。オプションが -o の場合、設定は人間が読める形式で出力されます。オプションが +o の場合、設定はシェルに再入力して同じオプション設定を適用できるように、適切な形式で出力されます。
Argument List Processing セクションにリストされているオプション名に加えて、次のオプションを -o または +o の引数として指定できます。
pipefail パイプラインの終了ステータスを、パイプライン内のすべてのコマンドの終了ステータスから派生させます。最後のコマンドのみから派生させるのではなく、Pipelines セクションで説明されているようにします。
set コマンドの3番目の使用方法は、シェルの位置引数の値を指定された引数に設定することです。位置引数を変更せずにオプションを変更するには、最初の引数として「--」を使用します。引数がない場合、set コマンドはすべての位置引数をクリアします (「shift $#」を実行するのと同じです)。
shift [n]
位置引数を n 回シフトします。シフトは、$1 の値を $2 の値に、$2 の値を $3 の値に設定します。同様に、$# の値を 1 減らします。n が位置引数の数より大きい場合、shift はエラーメッセージを出力し、リターンステータス 2 で終了します。
test expression
[ expression ]
test ユーティリティは、expression を評価し、expression が true と評価された場合、ゼロ (true) の終了ステータスを返します。そうでない場合は、1 (false) を返します。expression がない場合、test は 1 (false) も返します。
すべての演算子とフラグは、test ユーティリティへの個別の引数です。
次のプライマリを使用して、expression を構築します。
-b file file が存在し、ブロック特殊ファイルである場合は true。
-c file file が存在し、文字特殊ファイルである場合は true。
-d file file が存在し、ディレクトリである場合は true。
-e file file が存在する場合 (タイプに関係なく) は true。
-f file file が存在し、通常のファイルである場合は true。
-g file ファイルが存在し、そのファイルのセットグループIDフラグが設定されている場合に真。
-h file ファイルが存在し、シンボリックリンクである場合に真。
-k file ファイルが存在し、スティッキービットが設定されている場合に真。
-n string 文字列の長さがゼロでない場合に真。
-p file ファイルが存在し、名前付きパイプ(FIFO)である場合に真。
-r file ファイルが存在し、読み取り可能である場合に真。
-s file ファイルが存在し、サイズがゼロより大きい場合に真。
-t file_descriptor
ファイルディスクリプタ番号がfile_descriptorであるファイルがオープンされており、ターミナルに関連付けられている場合に真。
-u file ファイルが存在し、そのファイルのセットユーザーIDフラグが設定されている場合に真。
-w file ファイルが存在し、書き込み可能である場合に真。真は、書き込みフラグがオンになっていることだけを示す。ファイルシステムが読み取り専用の場合でも、このテストが真を返すことがある。
-x file ファイルが存在し、実行可能である場合に真。真は、実行フラグがオンになっていることだけを示す。ファイルがディレクトリの場合、真は、ファイルが検索可能であることを示す。
-z string 文字列の長さがゼロである場合に真。
-L file ファイルが存在し、シンボリックリンクである場合に真。この演算子は、以前のバージョンのプログラムとの互換性のために保持されている。これに依存しないこと。代わりに-hを使用すること。
-O file ファイルが存在し、そのファイルの所有者が、このプロセスの有効ユーザーIDと一致する場合に真。
-G file ファイルが存在し、そのファイルのグループが、このプロセスの有効グループIDと一致する場合に真。
-S file ファイルが存在し、ソケットである場合に真。
file1 -nt file2
file1とfile2の両方が存在し、file1がfile2よりも新しいか、またはfile1が存在するがfile2が存在しない場合に真。
file1 -ot file2
file1とfile2の両方が存在し、file1がfile2よりも古いか、またはfile2が存在するがfile1が存在しない場合に真。
file1 -ef file2
file1とfile2の両方が存在し、同じファイルを指す場合に真。
string 文字列がnull文字列でない場合に真。
s1 = s2 文字列s1とs2が同一である場合に真。
s1 != s2 文字列s1とs2が同一でない場合に真。
s1 < s2 文字列s1が、その文字のASCII値に基づいて、文字列s2よりも前に来る場合に真。
s1 > s2 文字列s1が、その文字のASCII値に基づいて、文字列s2よりも後に来る場合に真。
n1 -eq n2 整数n1とn2が代数的に等しい場合に真。
n1 -ne n2 整数n1とn2が代数的に等しくない場合に真。
n1 -gt n2 整数n1が、整数n2よりも代数的に大きい場合に真。
n1 -ge n2 整数n1が、整数n2よりも代数的に大きいか等しい場合に真。
n1 -lt n2 整数n1が、整数n2よりも代数的に小さい場合に真。
n1 -le n2 整数n1が、整数n2よりも代数的に小さいか等しい場合に真。
これらの基本要素は、次の演算子と組み合わせて使用できます。
! expression expressionがfalseの場合に真。
expression1 -a expression2
expression1とexpression2の両方がtrueの場合に真。
expression1 -o expression2
expression1またはexpression2のいずれかがtrueの場合に真。
(expression) 式が真である場合、真を返します。
-a 演算子は、-o 演算子よりも高い優先順位を持ちます。
times シェルとシェルから実行されたプロセスの累積ユーザー時間とシステム時間を表示します。戻りステータスは0です。
trap [アクション シグナル ...]
シェルに、指定されたシグナルが受信されたときにアクションを解析および実行させます。シグナルは、シグナル番号またはシグナルの名前で指定されます。シグナルが0またはEXITの場合、アクションはシェルが終了するときに実行されます。アクションは空('')にすることができます。この場合、指定されたシグナルは無視されます。アクションが省略されるか、'-'に設定された場合、指定されたシグナルはデフォルトのアクションに設定されます。シェルがサブシェルをフォークオフすると、トラップされた(ただし無視されていない)シグナルはデフォルトのアクションにリセットされます。シェル起動時に無視されていたシグナルに対して、trapコマンドは効果がありません。引数なしでtrapを実行すると、トラップされたシグナルとその関連アクションのリストを、同じトラップ結果を達成するシェルへの入力として適切な形式で標準出力に出力します。
例:
trap
トラップされたシグナルとその対応するアクションを一覧表示します。
trap '' INT QUIT tstp 30
シグナルINT、QUIT、TSTP、USR1を無視します。
trap date INT
シグナルINTを受信したときに、日付を出力します。
type [名前 ...]
各名前をコマンドとして解釈し、コマンド検索の結果を出力します。可能な解決策は、シェルキーワード、エイリアス、シェル組み込みコマンド、コマンド、追跡されたエイリアス、および見つからないのいずれかです。エイリアスの場合はエイリアスの展開が出力され、コマンドと追跡されたエイリアスの場合はコマンドの完全なパスが出力されます。
ulimit [-H | -S] [-a | -tfdscmlpnvwr [値]]
プロセスに対するハードまたはソフト制限について問い合わせるか、新しい制限を設定します。ハード制限(どのプロセスも違反できない制限であり、一度下げられた後は上げることができない)と、ソフト制限(プロセスにシグナルが送信されるが、必ずしも強制終了されるわけではなく、上げることができる)のどちらにするかは、次のフラグで選択します。
-H ハード制限を設定または問い合わせます。
-S ソフト制限を設定または問い合わせます。-Hまたは-Sのいずれも指定されていない場合、ソフト制限が表示されるか、両方の制限が設定されます。両方が指定されている場合、最後のものが優先されます。
次に、問い合わせるまたは設定する制限は、次のいずれかのフラグを指定することで選択されます。
-a 現在のすべての制限を表示します。
-t CPU時間の制限(秒単位)を表示または設定します。
-f 作成できる最大ファイルのサイズ(512バイトブロック単位)を表示または設定します。
-d プロセスのデータセグメントの最大サイズ(キロバイト単位)を表示または設定します。
-s プロセスのスタックの最大サイズ(キロバイト単位)を表示または設定します。
-c 生成できる最大コアダンプサイズ(512バイトブロック単位)を表示または設定します。
-m プロセスが使用できる合計物理メモリの最大値(キロバイト単位)を表示または設定します。
-l プロセスがmlock(2)でロックできるメモリの最大値(キロバイト単位)を表示または設定します。
-p このユーザーが一度に持つことのできるプロセスの制限を表示または設定します。
-n プロセスが一度に開くことのできるファイルの数の制限を表示または設定します。
-v プロセスで使用できる合計仮想メモリ(キロバイト単位)の制限を表示または設定します。
-w プロセスが保持できるロックの合計数の制限を表示または設定します。
-r プロセスのリアルタイムスケジューリングの優先順位の制限を表示または設定します。
これらのオプションが指定されていない場合、表示または設定されるのはファイルサイズの制限です。値が指定された場合、制限はその値に設定されます。それ以外の場合は、現在の制限が表示されます。
任意のプロセスの制限を表示または設定するには、sysctl(8)ユーティリティを使用します。
umask [マスク]
umask(umask(2)を参照)の値を指定された8進値に設定します。引数が省略された場合、umaskの値が出力されます。
unalias [-a] [名前]
名前が指定された場合、シェルはそのエイリアスを削除します。-aが指定された場合、すべてのエイリアスが削除されます。
unset [-fv] 名前 ...
指定された変数と関数がアンセットされ、エクスポート解除されます。-fまたは-vが指定された場合、それぞれ対応する関数または変数がアンセットされます。特定の名前が変数と関数の両方に該当し、オプションが指定されていない場合、変数のみがアンセットされます。
wait [ジョブ]
指定されたジョブが完了するまで待機し、ジョブ内の最後のプロセスの終了ステータスを返します。引数が省略された場合、すべてのジョブが完了するまで待機し、0の終了ステータスを返します。
コマンドライン編集
dashがターミナルからインタラクティブに使用されている場合、現在のコマンドとコマンド履歴(fcを参照)は、viモードのコマンドライン編集を使用して編集できます。このモードでは、viのmanページで説明されているものに類似したコマンドが使用されます。コマンド「set -o vi」はviモードの編集を有効にし、shをviの挿入モードに配置します。viモードが有効になっている場合、shは挿入モードとコマンドモードの間で切り替えることができます。viと同様に、⟨ESC⟩を入力するとviのコマンドモードに入ります。コマンドモードで⟨return⟩を押すと、行がシェルに渡されます。
終了ステータス
シェルによって検出された構文エラーなどのエラーは、シェルがゼロ以外の終了ステータスで終了するようにします。シェルがインタラクティブなシェルでない場合、シェルファイルの実行は中止されます。それ以外の場合、シェルは最後に実行されたコマンドの終了ステータスを返し、またはexit組み込み関数が数値引数とともに使用された場合、その引数を返します。
環境
HOME login(1)によって、パスワードファイル(passwd(4))内のユーザーのログインディレクトリから自動的に設定されます。この環境変数は、cd組み込み関数のデフォルトの引数としても機能します。
PATH 実行可能ファイルのデフォルトの検索パスです。上記の「パス検索」セクションを参照してください。
CDPATH cd組み込み関数で使用される検索パスです。
MAIL メールが到着したかどうかを確認するメールファイルのファイル名。MAILPATHによって上書きされます。
MAILCHECK シェルが、MAILPATHまたはMAILファイルで指定されたファイル内の新しいメールの到着をチェックする頻度(秒単位)。0に設定すると、各プロンプトでチェックが行われます。
MAILPATH シェルが受信メールをチェックするファイル名のコロン「:」で区切られたリスト。この環境設定は、MAIL設定を上書きします。一度に監視できるメールボックスの最大数は10です。
PS1 主要なプロンプト文字列。デフォルトは「$ 」で、スーパーユーザーの場合は「# 」に設定されます。
PS2 二次プロンプト文字列。デフォルトは「> 」です。
PS4 実行トレース(set -x)が有効になっている場合に各行の前に表示される文字列。デフォルトは「+ 」です。
IFS 入力フィールド区切り文字。通常は、スペース、タブ、および改行に設定されます。「空白による分割」のセクションを参照してください。
TERM シェルのデフォルトのターミナル設定。これはシェルの子プロセスに継承され、履歴編集モードで使用されます。
HISTSIZE シェル履歴バッファー内の行数。
PWD 現在の作業ディレクトリの論理値。cdコマンドによって設定されます。
OLDPWD 現在の作業ディレクトリの以前の論理値。cdコマンドによって設定されます。
PPID シェルの親プロセスのプロセスID。
ファイル
$HOME/.profile
/etc/profile
関連項目
csh(1), echo(1), getopt(1), ksh(1), login(1), printf(1), test(1), getopt(3), passwd(5), environ(7), sysctl(8)
履歴
dashは、/bin/shのPOSIX準拠の実装であり、できるだけ小さくなるように設計されています。dashは、NetBSDのash(Almquist SHell)の直接の派生物であり、1997年初頭にLinuxに移植されました。2002年にdashという名前が変更されました。
バグ
setuidシェルスクリプトは、重大なセキュリティリスクとなるため、あらゆる手段を講じて避ける必要があります。
PS1、PS2、およびPS4は、表示される前にパラメーター展開の対象となる必要があります。