EN JA
SH(1)
SH(1) FreeBSD General Commands Manual SH(1)

名称

shコマンドインタプリタ (シェル)

書式

sh [ -/+abCEefIimnPpTuVvx][ -/+o longname][ script [ arg ...]]

sh [ -/+abCEefIimnPpTuVvx][ -/+o longname] -c string [ name [ arg ...]]

sh [ -/+abCEefIimnPpTuVvx][ -/+o longname] -s [ arg ...]

解説

sh ユーティリティは、システムのための標準のコマンドインタプリタです。 sh の現在のバージョンは、シェルのための IEEE Std 1003.1 (“POSIX.1”) 仕様に近くなっています。それは、 POSIX によって指定された機能といくつかの Berkeley 版の拡張のみをサポートしています。このマニュアルページは、シェルの指導書でも完全な仕様書でもありません。

概要

シェルは、ファイルまたは端末からの行を読み込み、それらを解釈し、通常、他のコマンドを実行するコマンドです。それは、ユーザがシステムにログインするとき、開始されるプログラムですが、ユーザは、 chsh(1) コマンドで異なるシェルを選択することもできます。シェルは、組み込みのヒストリと行編集機能とともに、フロー制御構成、データ記憶に加えて様々な機能を提供するマクロ機能がある言語を実装しています。それは、対話型の使用を支援し、インタプリタ型の言語が対話型と非対話型の使用 (シェルスクリプト) の両方に共通の利点がある、多くの機能を組み込んでいます。すなわち、実行しているシェルに直接コマンドをタイプすることができるか、またはシェルによって直接実行することができる、ファイルに入れることができます。

起動

引数が存在しないなら、またシェルの標準入力が端末に接続されるなら (または -i オプションが設定されるなら)、シェルは、対話型のシェルと見なされます。対話型のシェルは、一般的に、各コマンドの前にプロンプトを出し、プログラミングとコマンドのエラーを (下記に記述されるように) 異なって扱います。最初に開始するとき、シェルは、引数 0 を検査し、それがダッシュ (‘ -’) で始まるなら、シェルは、また、ログインシェルと見なされます。これは、ユーザが最初にログインするとき、通常システムによって自動的に行われます。ログインシェルは、存在するなら、最初にファイル /etc/profile からコマンドを読み込み、次にユーザのホームディレクトリの .profile を読み込みます。環境変数 ENV がシェルの入口で設定されるか、またはログインシェルの .profile で設定されるなら、シェルは、次にパラメータの拡張と算数演算の拡張のために、その値を対象とし、指定されたファイルからコマンドを読み込みます。つまり、ユーザは、ログイン時にのみ実行したいコマンドを .profile に書き、シェルが起動されるたびに実行したいコマンドを環境変数 ENV で示すファイルに書くことになります。環境変数 ENV を設定するには、ホームディレクトリ下のファイル .profile に以下のように記述します。ここで .shrc のかわりに好きな名前を指定することができます:

ENV=$HOME/.shrc; export ENV

コマンドライン引数で指定されたオプション以外の最初のものを、シェルは、コマンドを読み込むべきファイル (シェルスクリプト) の名前であると解釈し、それ以後の引数は、シェルの位置パラメータ ( $1, $2, その他) に設定します。それ以外の場合、シェルは、コマンドを標準入力から読み込みます。

古いバージョンの sh とは異なり、環境変数 ENV で指定したスクリプトが実行されるのは、対話的シェルの呼び出し時のみです。これにより、いい加減に書かれた ENV スクリプトに起因する、簡単に食いものにされることが多い有名なセキュリティホールがふさがれたことになります。

引数リスト処理

sh の 1 文字からなるオプションは、それぞれ対応する長い名前を持っています。ただし -c-/+o は、例外です。次の解説では、長い名前は、単一文字オプションの隣に示されています。あるオプションの長い名前は、 sh-/+o オプションへの引数として指定可能です。シェルが起動されてからは、オプションの長い名前を set 組み込みコマンド (後述の 「組み込みコマンド」 で説明) の -/+o オプションへの引数として指定可能です。マイナス記号 (‘ -’) でオプションを指定することは、そのオプションを有効にすることを意味し、プラス記号 (‘ +’) でオプションを指定することは、そのオプションを無効にすることを意味します。“ --”または、単なる‘ -’は、オプション処理を終了させ、コマンドラインの残りの語を引数として解釈することを強制します。 -/+o-c のオプションは、長い名前を持ちません。
-a allexport
値が代入されたときに変数をエクスポートするよう、変数にフラグを付けます。
-b notify
バックグラウンドジョブ実行の完了を、コマンドが実行中でも即座に報告します (未実装です)。
-C noclobber
すでに存在するファイルを‘ >’リダイレクトで上書きしません。
-E emacs
組み込みの emacs(1) 風のコマンド行編集機能を有効にします ( -V オプションが指定されていたなら、それを無効にし、端末が対話的であるとき、自動的に、設定します)。
-e errexit
いずれかのテストされていないコマンドが非対話モードで失敗するなら、直ちに終了します。コマンドの終了ステータスは、コマンドが if, elif, while または until を制御するために使用されるリストの一部であるなら、明示的にテストされると見なされます。また、コマンドが“ &&”または“ ||”演算子の左辺のオペランドであるなら、テストされているとみなされます。また、コマンドが ! 演算子によって先導されたパイプラインであるなら、テストされているとみなされます。シェル関数が実行されて、終了ステータスが明らかにテストされているなら、関数のすべてのコマンドは、同様にテストされているとみなされます。
-f noglob
パス名展開を行いません。
-h trackall
POSIX 準拠のための何も行わないオプション。
-I ignoreeof
対話的シェルの場合、入力の EOF を無視します。
-i interactive
シェルが対話的に動作するように強制します。
-m monitor
ジョブ制御を可能にします (対話的シェルの場合は、自動的に設定されます)。
-n noexec
非対話的シェルの場合、コマンドを読み込みますが、そのコマンドの実行はしません。シェルスクリプトの文法を検査する場合に便利です。
-P physical
cdpwd コマンドにおけるデフォルトを -L (論理的なディレクトリレイアウト) から -P (物理的なディレクトリレイアウト) へ変更します。
-p privileged
特権モードを有効にします。起動時に実効ユーザ ID あるいは実効グループ ID が、実ユーザ ID や実グループ ID と一致していなければ、このモードが有効になります。このモードを無効化すると、実効ユーザ ID および実効グループ ID は、実ユーザ ID および実グループ ID に設定されます。対話的シェルでこのモードが有効になっていると、 /etc/profile の後で ~/.profile に代わり、 /etc/suid_profile を読み込みます。一方、環境変数 ENV の内容は、無視されます。
-s stdin
コマンドを標準入力から読み込みます (引数でファイル名が指定されていない場合には、このオプションが自動的に設定されます)。シェルが実行されてから本オプションを ( set などによって) 設定しても効果はありません。
-T trapsasync
子を待つとき、即座にトラップを実行します。本オプションが設定されていないと、 IEEE Std 1003.2 (“POSIX.2”) で指定されているように、子が終了した後にトラップが実行されます。この非標準オプションは、シグナルをブロックする子の周囲に保護シェルを置くために有用です。周囲のシェルは、子を殺したり、次のように、制御を tty に戻して子だけを残したりできます:

sh -T -c "trap 'exit 1' 2 ; some-blocking-program"
-u nounset
設定されていない変数、位置パラメータまたは特殊パラメータ ! を拡張することを試みるとき、標準エラーにメッセージを書き込み、シェルが対話的でないなら、直ちに終了します。
-V vi
組み込みの vi(1) 風の行編集機能を有効にします (それ以前に -E オプションが指定されていた場合、それは、無効になります)。
-v verbose
入力を読み込むごとに標準エラー出力に書き込みます。デバッグのときに便利です。
-x xtrace
コマンドが実行される前に、(パラメータの拡張と算数円剤のために対象とされた PS4 変数の値を前に付けて) 各コマンドを標準エラーに書き込みます。デバッグのために役に立ちます。

-c オプションによって、標準入力の代わりに string オペランドからコマンドを読み込みます。このオプションは、引数として文字列を一つだけ受け取ることに注意して下さい。ですから、複数の単語からなる文字列は、引用符で囲う必要があります。

-/+o オプションは、オプションの長い名前のみを引数としてとり、オプションの有効化と無効化を行います。例えば、次の 2 つの sh 起動方法では、組み込みの emacs(1) コマンドラインエディタを有効化します:

set -E 
set -o emacs

-o オプションが引数なしで使用された場合、現在のオプション設定を人が読める形式で表示します。 +o が引数なしで使用された場合は、現在のオプション設定をシェルへ再入力するのに適した形式で出力します。

構文構造

シェルは、ファイルを行単位で読み込み、空白文字 (ブランクおよびタブ) やシェルにとって特別な意味を持つ特定の文字列 (“演算子”と呼ばれるものです) を区切りとして、複数の単語に分割します。演算子には、制御演算子とリダイレクト演算子の 2 種類があります (これらの意味については後述します)。次は、有効な演算子のリストです:
制御演算子:
& && ( ) \n
;; ;& ; | ||
リダイレクト演算子:
< > << >> <>
<& >& <<- >|

文字‘ #’が、単語の始まりで使用されるなら、コメントになります。‘ #’で始まる単語と行の残りは、無視されます。

ASCII NUL (ヌル) 文字 (文字コード 0) は、シェル入力で許可されていません。

引用 (クォート)

引用は、シェルにとって特殊な意味を持つ文字や単語 (演算子、空白類、キーワード、エイリアス名など) の意味を打ち消すために使用されます。

引用には、次の 4 つのタイプがあります: 一致するシングルクォート、ドル文字シングルクォート、一致するダブルクォート、とバックスラッシュ。

シングルクォート
シングルクォートのペアで囲まれた文字は、すべてその文字そのまま (リテラル) として扱われます (ただしシングルクォートは、別です。シングルクォートで囲った文字列の中にシングルクォートを含めることはできません)。
ドル文字シングルクォート
$'' の間の文字で囲まれた文字は、バックスラッシュとシングルクォートを除いて、すべての文字のリテラルの意味を維持します。バックスラッシュは、C スタイルのエスケープシーケンスを取り入れます:
\a
アラート (端末のベルを鳴らします)
\b
バックスペース
\c c
stty(1)^ c によって示される制御文字。 c がバックスラッシュであるなら、2 つ指定しなければなりません。
\e
ESC 文字 (ASCII 0x1b)
\f
フォームフィード
\n
改行
\r
キャリッジリターン
\t
水平タブ
\v
垂直タブ
\\
リテラルのバックスラッシュ
\'
リテラルのシングルクォート
\"
リテラルのダブルクォート
\ nnn
8 進数値が nnn (1 から 3 桁) であるバイト
\x nn
16 進数値が nn (最後の 2 つのみが使用される 1 つ以上の桁) であるバイト
\u nnnn
ユニコードのコードポイント nnnn (4 つの 16 進数)
\U nnnnnnnn
ユニコードのコードポイント nnnnnnnn (8 つの 16 進数)

ユニコードのコードポイントのためのシーケンスは、現在、 UTF-8 ロケールでのみ役に立ちます。それらは、コードポイント 0 と UTF-16 のサロゲート (surrogate) を受け付けません。

エスケープシーケンスが値 0 のバイトを生成するなら、そのバイトとマッチするシングルクォートまでの文字列の残りは、無視されます。

バックスラッシュから始まる他の文字列は、エラーです。

ダブルクォート
ダブルクォートのペアで囲まれた文字は、ドル記号文字 (‘ $’)、バッククォート文字 (‘ `’)、バックスラッシュ文字 (‘ \’) を除き、すべてリテラルとして扱われます。ダブルクォート文字による引用の中にあるバックスラッシュ文字は、歴史的経緯によりすこし変わった扱いを受けます。次の文字の前にある場合は、クォートになりますが、それ以外ではリテラルのままとなります:

$ ` " \ \n
バックスラッシュ
バックスラッシュは、その後ろの 1 文字を、リテラルとして扱うように指示します。ただし改行文字 (‘ \n’) は、別です。改行文字の直前のバックスラッシュは、行の継続であるとみなされます。

キーワード

キーワードまたは予約語は、シェルにとって特別な意味を持つ単語で、行の先頭と制御演算子の直後で認識されます。次は、キーワードです:
! { } case do
done elif else esac fi
for if then until while

エイリアス

エイリアスは、 alias 組み込みコマンドを使用して設定される名前と対応する値です。単純なコマンドのコマンドの単語が現れるかどうか、そして、キーワードが現れるなら、キーワードをチェックした後に、シェルは、それがエイリアスに一致しているかどうか確かめるためにその単語をチェックします。もし一致したならば、入力行の中で、その単語をエイリアスの値に置き換えます。たとえば、“ lf”という名前で“ ls -F”という値を持つエイリアスが存在したとすると、次の入力行

lf foobar

は、以下のように置換されます。

ls -F foobar

エイリアスは、初心者に対し、引数付きの関数を生成する面倒を求めることなく、短いコマンドを作り出す便利な方法を提供するものです。スクリプトのエイリアスを使用することは、それらを使用するコードを解析する前に、それらを定義するコマンドを実行しなければならないので、お勧めできません。これは、不安定であり、移植性がありません。

エイリアス名は、コマンドラインでエイリアス名の内か隣接する文字に引用を使用して、そのエイリアス値を置き換えないように、回避することができます。これは、ほとんどの場合、同じ名前の関数、組み込み、または、通常のプログラムを実行するために、バックスラッシュをエイリアス名の前に置くことによって、行われます。 「引用 (クォート)」 セクションを参照してください。

コマンド

シェルは、このマニュアルページの範囲外の仕様 (IEEE Std 1003.2 (“POSIX.2”) 文書の BNF を参照) である、言語に従って読み込まれた単語を解釈します。要するに、行を 1 行を読み込み、読み込んだ行の最初の単語 (制御演算子がある場合は、そのあとの最初の単語) がキーワードでない場合、シェルは、その行を単純コマンドとして解釈します。それ以外の場合、複合コマンドあるいは特殊構造であると解釈します。

単純コマンド

単純コマンドを解釈する場合、シェルは、以下のような動作をします:
  1. 単語の前にある“ name=value”の形式の単語を取り除き、単純コマンドの環境に代入します。リダイレクト演算子とその引数 (後述) を取り除き、あとで処理できるように保存します。
  2. 残った単語を、 「単語展開」 のセクションで説明する方法で展開します。展開後の最初の単語をコマンド名とみなし、コマンドの位置を検索します。残りの単語は、コマンドへの引数とみなされます。処理の結果、コマンド名が残らなかった場合、手順 1) で取り出した“ name=value”の変数代入を、現在のシェルの環境に反映します。
  3. 次のセクションで説明する方法で、リダイレクトを行います。

リダイレクト

リダイレクトは、コマンドがどこから入力するか、どこへ出力するかを変更するときに用います。一般には、リダイレクトでは、ファイルのオープン、クローズ、またはファイルへの参照の複製 (duplicate) を行います。リダイレクトで用いられる全般的な形式は、次の通りです:

[ n] redir-op file

ここで、 redir-op は、前述したリダイレクト演算子のいずれかです。これらの演算子をどのように利用するかの例をいくつか以下に挙げます。

[ n] > file
標準出力 (またはファイル記述子 n) を file にリダイレクトします
[ n] >| file
上と同様。ただし -C オプションの効果を打ち消します。
[ n] >> file
標準出力 (またはファイル記述子 n) を file に追加します。
[ n] < file
標準入力 (またはファイル記述子 n) を file からリダイレクトします。
[ n] <> file
標準入力 (またはファイル記述子 n) を file から/へ、リダイレクトします。
[ n1] <& n2
ファイル記述子 n2 を標準入力 (またはファイル記述子 n1) に複製します。
[ n] <&-
標準入力 (またはファイル記述子 n) をクローズします。
[ n1] >& n2
標準出力 (またはファイル記述子 n1) をファイル記述子 n2 に複製します。
[ n] >&-
標準出力 (またはファイル記述子 n) をクローズします。

以下のリダイレクトは、しばしば“ヒア・ドキュメント (here-document)”と呼ばれます。

[n]<< delimiter 
here-doc-text 
... 
delimiter

シェルは、delimiter までの行を保存し、コマンドへの標準入力またはファイル記述子 n にリダイレクトします。最初の行の delimiter が引用 (クォート) されていた場合、 here-doc-text の内容をリテラルとして扱います。そうでない場合、パラメータ展開、コマンド置換、数値演算 ( 「単語展開」 のセクションで説明します) を適用します。演算子が (“ <<”でなく) “ <<-”の場合は、 here-doc-text の各行の行頭のタブを取り除きます。

コマンド検索と実行

コマンドには、シェル関数、組み込みコマンド、通常プログラムの 3 種類があり、コマンドを検索する際には、シェルは、名前の検索をこの順序で行います。 3 種類のコマンドは、異なる方法で実行されます。

シェル関数を実行するとき、 $0 を除くすべての位置パラメータ ($1, $2,..) をシェル関数への引数として設定します。 $0 は、変更されません。シェル関数の環境として指定された変数 (関数名の直前に代入されたもの) は、その関数に局所的な変数となり、指定された初期値が設定されます。そして、シェルは、関数定義で与えられたコマンドを実行します。コマンドの実行が完了すると、位置パラメータを元の値に戻します。これは、全て現在のシェルの中で処理されます。

シェルの組み込みコマンドは、新たなプロセスを spawn せずにシェルの内部で実行されます。 2 種類の組み込みコマンドがあります: 通常と特別です。それらの実行が終了した後に、特別な組み込みが持続する前に割り当てます、割り当てエラー、リダイレクションエラーと特定のオペランドエラーによって、スクリプトは、アボートされます。関数で特別な組み込み関数をを上書きすることはできません。通常と特別の組み込みの両方は、通常のプログラムができない方法で、シェルに影響することができます。

コマンドが関数でも組み込みコマンドでもない場合は、通常のプログラムとみなし (次のセクションで説明するとおり) ファイルシステムの中でそのコマンドを検索します。通常のプログラムを実行する場合、シェルは、引数と環境をプログラムに渡して、そのプログラムを実行します。プログラムが通常の実行形式ファイルではない (すなわち、 ASCII 表現が“ #!”である“マジックナンバ”で始まってなくて、 execve(2) からの返り値 ENOEXEC の結果となるなら) が、テキストファイルであるように思われるなら、シェルは、それを解釈するために sh の新しいインスタンスを実行します。

本ドキュメントの古いバージョンや古いソースコードでは、ときおり、マジックナンバのないシェルスクリプトのことを“シェル手続き”と呼んでいて、まぎらわしい場合がありますので注意して下さい。

パス検索

コマンドを検索するとき、シェルは、まず、その名前のシェル関数があるかどうかを調べます。次に、その名前の組み込みコマンドがあるかどうかを調べます。組み込みコマンドでもない場合、以下のいずれかの処理が行われます:
  1. コマンド名にスラッシュが含まれていれば、検索は、行わず、単にそのコマンドが実行されます。
  2. シェルは、コマンドの順序で PATH 変数の各エントリを検索します。 PATH 変数の値は、コロンによって区切られた一連のエントリであるべきです。各エントリは、それぞれディレクトリ名一つに対応します。カレントディレクトリは、空のディレクトリ名を指定することで暗黙的に、あるいは 1 個のピリオドを指定することで明示的に指示することができます。

コマンドの終了ステータス

各コマンドは、終了ステータスを持ち、それにより他のシェルコマンドの動作に影響を与えることができます。基本的な考え方として、終了ステータス 0 は、通常の終了または成功を示します。 0 以外の終了ステータスは、失敗、エラーを意味します。各コマンドのマニュアルページにそれぞれの終了ステータスがどのような意味を持つかが記述されているはずです。組み込みコマンドと (実行された) 関数も終了ステータスを返します。

コマンドがシグナルにより終了 (terminate) させられた場合、終了ステータスは、128 にシグナル番号を加えたものになります。シグナル番号は、ヘッダファイル < sys/signal.h> に定義されています。

複合コマンド (Complex Commands)

複合コマンドは、単純コマンドの組み合わせで作ります。制御演算子またはキーワードと組み合わせることで、より大きな複合コマンドを生成します。一般に、コマンドは、以下のうちのいずれかです:
  • 単純コマンド
  • パイプライン
  • リストまたは合成リスト (compound-list)
  • 合成コマンド (compound command)
  • 関数定義

特に指定のない場合、コマンドの終了ステータスは、最後に実行された単純コマンドの終了ステータスとなります。

パイプライン

パイプラインは、複数のコマンドを制御演算子‘ |’によってつないだものです。最後のコマンドを除くすべてのコマンドの標準出力は、次のコマンドの標準入力に接続されます。最後のコマンドの標準出力は、通常通り、シェルから受け継がれます。

パイプラインの形式は、次の通りです:

[ !] command1 [ | command2 ...]

command1 の標準出力は、 command2 の標準入力に接続されます。コマンドの標準入出力がパイプラインによって割り当てられるのは、各コマンドに属するリダイレクト演算子で指定されたリダイレクトを処理する前のことだと考えて下さい。

他のいくつかのシェルと異なって、 sh は、サブシェル環境で 2 つ以上のコマンドでパイプラインの各プロセスを、そして sh のプロセスの子供として実行することに注意してください。

パイプラインがバックグラウンド (後述) でなければ、シェルは、すべてのコマンドが終了するのを待ちます。

パイプラインの直前にキーワード ! が置かれなかった場合、終了ステータスは、パイプラインの最後のコマンドの終了ステータスとなります。 `!' が前置された場合、終了ステータスは、パイプラインの最後のコマンドの終了ステータスの論理否定を取った値となります。すなわち、最後のコマンドが 0 を返した場合、パイプラインの終了ステータスは、1 に、最後のコマンドが 0 より大きな値を返した場合、終了ステータスは、0 になります。

パイプラインによる標準入出力の接続は、リダイレクトに先立って行われるため、パイプラインの接続をリダイレクトによって修正することができます。たとえば:

command1 2>&1 | command2

command1 の標準出力と標準エラー出力の両方を command2 の標準入力に接続します。

;’または改行文字を終端として用いることにより、直前の AND-OR リスト ( 「短絡リスト演算子」 で後述) を順次実行します。‘ &’は、直前の AND-OR リストを非同期に実行します。

バックグラウンドコマンド (&)

コマンドが制御演算子アンパサンド (‘ &’) によって終了されるなら、シェルは、サブシェル環境 (以下の 「コマンドのグループ化」 を参照) でコマンドを非同期に実行します。シェルは、次のコマンドを実行する前にコマンドが終了するのを待ちません。

コマンドをバックグラウンドで実行させるための形式は、次の通りです:

command1 & [ command2 & ...]

シェルが対話的でない場合、非同期コマンドの標準入力には /dev/null が接続されます。

リスト (一般的な話)

リストは、0 個またはそれ以上のコマンドを改行文字、セミコロン文字、アンパサンド文字 (&) で区切った列です。リストは、これら 3 つの記号のいずれかで終了させることもできます。リスト中のコマンドは、並べられた順に実行されます。もし、コマンドに続けてアンパサンド文字が置かれている場合、シェルは、そのコマンドを起動したあと、すぐに次のコマンドの処理を開始します。その他の場合、そのコマンドの終了を待ってから次のコマンドの処理を開始します。

短絡リスト演算子 (Short-Circuit List Operators)

&&”と“ ||”は、AND-OR リスト演算子です。“ &&”は、最初のコマンドを実行し、もし最初のコマンドの終了ステータスが 0 ならば次のコマンドを実行します。“ ||”も同様ですが、最初のコマンドの終了ステータスが 0 でない場合に、次のコマンドを実行します。“ &&”と“ ||”の優先順位は、同じです。

フロー制御構成 (if, while, for, case)

if コマンドの構文は、次の通りです:
if list 
then list 
[elif list then list] 
... 
[else list] 
fi

while コマンドの構文は、次の通りです:

while list 
do list 
done

最初のリストの終了ステータスが 0 であるかぎり、2 つのリストを繰り返し実行します。 until コマンドも同様に実行しますが、単語 while の代わりに単語 until を使うことと、最初のリストの終了ステータスが 0 になるまで、 2 つのリストを繰り返し実行することが異なります。

for コマンドの構文は、次の通りです:

for variable [in word ...] 
do list 
done

in と続く単語が省略されるなら、 in "$@" が代わりに使用されます。各 word は、展開され、変数 variable に word を順に設定しながらリストを繰り返し実行します。 dodone は、‘ {’と‘ }’で置き換えることができます。

breakcontinue コマンドの構文は、次の通りです:

break [ num]
continue [ num]

break コマンドは、内側から num 個の for ループまたは while ループを終了します。 continue コマンドは、内側から num 個のループの次の繰り返しに制御を移します。これらのコマンドは、特別な組み込みコマンドとして実装されています。

case コマンドの構文は、次の通りです:

case word in 
pattern) list ;; 
... 
esac

pattern (パターン) は、実際に‘ |’文字によって区切られた 1 つ以上のパターン (後で説明される 「シェルパターン」 を参照) を指定することができます。チルダ拡張、パラメータ拡張、コマンド置換、算数演算と引用文の削除は、その単語に適用されます。次に、各パターンは、順番にチルダ拡張、パラメータ拡張、コマンド置換と算数演算を使用して拡張され、その単語の拡張形は、それに対してチェックされます。マッチが見つけられるなら、対応するリストが実行されます。選択されたリストが‘ ;;’の代わりに制御演算子‘ ;&’で終了するなら、実行は、次のリストを続行し、リストが‘ ;;’または case コマンドで終るまで、続行されます。 case コマンドの終了コードは、リストで実行された最後のコマンドの終了コードか、またはパターンが何も一致しないなら、0 です。

コマンドのグループ化

コマンドは、次のいずれかを書くことによってグループ化されます。

( list )

または、

{ list ; }

最初の形式は、サブシェル環境でコマンドを実行します。サブシェル環境には、それ自体に次のコピーがあります:

  1. cd によって設定されるカレントワーキングディレクトリ。
  2. umask によって設定されるファイル作成マスク。
  3. ulimit によって設定されるリソースの制限。
  4. オープンされたファイルへの参照。
  5. trap によって設定されるトラップ。
  6. 知られているジョブ。
  7. 位置パラメータと変数。
  8. シェルオプション。
  9. シェル関数。
  10. シェルエイリアス。

これらは、トラップされる (が、無視されない) シグナルがデフォルトのアクションにリセットされ、知られているジョブがクリアされることを除いて、親のシェル環境からコピーされます。どのような変更も親のシェル環境に影響しません。

サブシェル環境は、子供のプロセスまたは異なって実装されます。ジョブ制御が対話的なシェルで有効にされているなら、括弧でグループ化されたコマンドは、1 つのユニット (単位) としてサスペンドして、継続することができます。

他のシェルとの互換性のために、シーケンス中の 2 つの開き括弧は、空白類によって分離されるべきです。

2 番目の形式は、決して別のシェルを fork しないので、より少し効率的です。コマンドをグループにまとめるこの方法によって、ユーザは、あたかもそれらが 1 つのプログラムであのように、それらの出力をリダイレクトすることができます:

{ echo -n "hello"; echo " world"; } > greeting

関数

関数定義の構文は、次の通りです:

name ( ) command

関数定義は、実行可能文の一種です。実行されると、名前 name の関数が定義され、終了ステータスとして 0 を返します。 command は、通常、‘ {’と‘ }’で囲まれたリストです。

local コマンドを用いて関数に局所的な変数を宣言することができます。これは、関数の最初の文として現れるべきで、構文は、次の通りです:

local [ variable ...][ -]

local コマンドは、組み込みコマンドとして実装されています。

変数を局所変数にする場合、関数を呼び出した環境に同じ名前の変数があれば、新しい局所変数は、値と export、readonly フラグを引き継ぎます。もし同じ名前の変数がなければ、局所変数は、初期値を持ちません。シェルは、動的スコープを用います。すなわち、関数 f に局所的な変数 x を作成し、関数 f から関数 g を呼び出した場合、関数 g 内部での変数 x に対する操作は、グローバル変数 x ではなく、関数 f で宣言された変数 x への操作となります。

特殊パラメータのうち局所宣言できるのは、‘ -’だけです。‘ -’を局所宣言すると、関数内で set コマンドを用いてシェルオプションを変更しても、関数が終了するとそれらのオプションは、元の値に戻ります。

return コマンドの構文は、次の通りです:

return [ exitstatus]

それは、最も近い入れ子の関数またはソースされた (ソースコマンドで読み込まれた) スクリプトから返って、現在の実行スコープを終了します。関数またはソースされたスクリプトが実行されていないなら、それは、シェルのインスタンスを終了します。 return は、特別な組み込みコマンドとして実装されています。

変数とパラメータ

シェルは、パラメータの集合を管理しています。名前を持つパラメータを変数と呼びます。シェルは、起動時にすべての環境変数をシェル変数に取り込みます。新たな変数は、次の形式によって設定できます。

name= value

ユーザが設定する変数は、アルファベット、数字、アンダスコア (_) のみからなる名前を持つ必要があります。また、最初の文字が数字であってはいけません。パラメータは、以下に示す数字または特殊記号により参照することもできます。

代入は、他の単語とは異なって展開されます: また、チルダ展開は、等号、と任意のコロンの後に行なわれ、ユーザ名も、コロンによって終了します、そして分割されるフィールドとパス名の展開は、行なわれません。

この特別の拡張は、それら自体によって、またはコマンドの単語に先行する単純なコマンドを形成する割り当てだけでなく適応されますが、この形式がある export, local または readonly 組み込みコマンドに渡された単語も適応されます。これについて、組み込みの名前は、(拡張の結果ではなく) リテラルでなければなりません、オプションのない command の 1 つ以上のリテラルのインスタンスによってオプションで先行されるかもしれません。

位置パラメータ

位置パラメータは、0 より大の数字によって参照されるパラメータです。シェルは、位置パラメータの初期値としてシェルスクリプト名に続く引数を設定します。組み込みコマンド set により再設定や消去ができます。

特殊パラメータ

特殊パラメータは、単一の特殊文字または数値 0 によって示されるパラメータです。それらは、ちょうどユーザによってタイプされる入力か、またはシェルスクリプトのソースに現れる、次のリストに表示されます。
$*
位置パラメータ 1,2,... に展開されます。ダブルクォート文字列内部で展開される場合、展開結果は、各位置パラメータの間を変数 IFS の先頭の文字 ( IFS が設定されていない場合は、空白) で区切った単一の文字列になります。
$@
位置パラメータ 1,2,... に展開されます。ダブルクォート引用の内部で展開される場合、各位置パラメータは、別々の引数となります。もし、位置パラメータが設定されていない場合には、 @ の展開結果は、0 個の引数となります ( @ がダブルクォート引用の内部であっても)。例えば、これが基本的に意味するこは、 $1 が“ abc”、 $2 が“ def ghi”であったなら、 "$@" は、次の 2 つの引数に展開されます:

"abc"   "def ghi"
$#
位置パラメータの数に展開されます。
$?
最後に実行したパイプラインの終了ステータスに展開されます。
$-
(ハイフン) 現在のオプションフラグ (1 文字オプション名をつないだ文字列) に展開されます。起動時に指定されたもの、組み込みコマンド set で指定したもの、シェルが暗黙に設定したもののすべてを含みます。
$$
起動されたシェルのプロセス ID に展開されます。サブシェルは、親として $ と同じ値を保持します。
$!
現在のシェルが最後にバックグラウンドで実行したコマンドのプロセス ID に展開されます。パイプラインの場合、パイプラインの最後のコマンドのプロセス ID になります。このパラメータが参照されるなら、シェルは、 wait 組み込みコマンドがプロセスの完了を報告するまで、プロセス ID とその終了ステータスを覚えています。
$0
(ゼロ) コマンドラインで渡されるなら、シェルスクリプトの名前に、 ( -c を付けて) 与えられるなら、 name オペランドに展開されます、そうでなければ、シェルに引数 0 が渡されます。

特殊変数

次の変数は、シェルによって設定されるか、または特別な意味があります:
CDPATH
cd 組み込みコマンドで使用される検索パス。
EDITOR
fc 組み込みコマンドで使用されるフォールバック (代替) エディタ。設定されてないなら、デフォルトのエディタは、 ed(1) です。
FCEDIT
fc 組み込みコマンドで使用されるデフォルトのエディタ。
HISTSIZE
アクセス可能な以前のコマンドの数。
HOME
チルダ展開と cd 組み込みコマンドのデフォルトのディレクトリとして使用されるユーザのホームディレクトリ。
IFS
入力フィールドのセパレータ。デフォルト値は、<空白>, <タブ>と<改行>の順です。または、このデフォルトは、 IFS が設定されなければ、適用されますが、空の文字列に設定されるなら、適用されません。詳細については、 「空白類文字による分割 (フィールド分割)」 セクションを参照してください。
LINENO
スクリプトまたは関数の現在の行番号。
MAIL
新しいメールの到着がないかどうかチェックされるメールファイルの名前。 MAILPATH によって上書きされます。
MAILPATH
着信メールがないかどうかシェルによってチェックされる、コロン (‘ :’) で区切られたファイル名のリスト。この変数は、 MAIL の設定を上書きします。一度に最大 10 個のメールボックスをモニタ (監視) することができます。
PATH
実行形式ファイルのためのデフォルト検索パス。詳細については、 「パス検索」 セクションを参照してください。
PPID
呼び出されたシェルの親プロセス ID。この変数が環境変数にないなら、起動時に設定されます。親プロセス ID の後の変更は、反映されません。サブシェルは、 PPID の同じ値を保持します。
PS1
プライマリのプロンプト文字列で、利用者がスーパユーザでないなら“ $ ”がデフォルトです、スーパユーザなら、“ # ”がデフォルトです。 PS1 は、与えられた情報によって置き換えられる、次の書式化されたシーケンスのうちのいずれかを含んでいます:
\H
ローカルホスト名。
\h
完全な形でのホスト名。
\W
現在の作業ディレクトリの最後の構成要素。
\w
現在の作業ディレクトリの完全なパス。
\$
スーパユーザの状態。通常のユーザのための“ $ ”とスーパユーザのための“ # ”。
\\
リテラルのバックスラッシュ。
PS2
セカンダリのプロンプト文字列で、“ > ”がデフォルトです。 PS2 は、 PS1 から書式化されたシーケンスのいずれかを含んでいます。
PS4
( -x がアクティブであるなら) トレースの出力のための接頭辞。デフォルトは、“ + ”です。

単語展開

このセクションでは、単語に対して適用されるさまざまな展開について説明します。あとで述べるように、すべての展開がすべての単語に対して適用されるわけではありません。

単一の単語に対して適用されたチルダ展開、パラメータ展開、コマンド置換、数式展開、クォート削除の結果は、単一のフィールドになります。単一の単語が複数のフィールドに分割される可能性があるのは、フィールド分割またはパス名展開の場合だけです。この規則の唯一の例外は、ダブルクォート中のパラメータ @ の展開です (前述)。

単語展開の順序は、次の通りです:

  1. チルダ展開、パラメータ展開、コマンド置換、数式展開 (これらは、すべて同時に行われます)
  2. 変数 IFS の値が空でなければ、(1) の結果の各フィールドに対してフィールド分割が行われる
  3. パス名展開 ( -f オプションが無効の場合)
  4. クォート削除

文字‘ $’は、パラメータ展開、コマンド置換、数式展開を行うきっかけになります。

チルダ展開 (ユーザのホームディレクトリ名への置換)

引用されていないチルダ文字 (‘ ~’) で始まる単語は、チルダ展開の対象になります。チルダ文字からスラッシュ文字 (‘ /’) または単語の終端までのすべての文字がユーザ名とみなされ、そのユーザのホームディレクトリに置き換えられます。 ( ~/foobar のように) ユーザ名が不足しているなら、チルダは、 HOME 変数の値 (現在のユーザのホームディレクトリ) に置き換えられます。

パラメータ展開

パラメータ展開の形式は、次の通りです:

${ expression }

ここで、 expression は、対応した‘ }’までのすべての文字です。バックスラッシュによってエスケープさるか、または、シングルクォートまたはダブルクォートの中の任意の‘ }’と、数式展開に埋め込まれた文字、コマンド置換と変数展開は、マッチする‘ }’を決定する上で調べられません。‘ +’, ‘ -’, ‘ =’または‘ ?’がある異形がダブルクォートに囲まれた文字列内に現れるなら、展開として、(展開の内側のダブルクォートを通して) クォートされない部分となるかもしれません。そのような部分内の‘ }’も、マッチする‘ }’を決定する上で調べられません。

パラメータ展開の形式のうちもっとも単純なものは、次の通りです:

${ parameter }

parameter に値があるなら、置き換えられます。

パラメータ名やシンボルを中括弧 ({}) で囲んでも構いません。この中括弧は、数字 2 文字以上からなる位置パラメータの場合や、パラメータ名の直後にパラメータ名の一部であるとみなし得る文字が続く場合を除き、省略可能です。ダブルクォート中のパラメータ展開は、以下のようになります:

  1. パラメータが特殊パラメータ @ の場合を除き、フィールド分割は、適用されません。
  2. パラメータ展開を行った結果の単語に対しては、パス名展開は、適用されません。

さらに、以下の形式を用いることにより、パラメータ展開の結果に修正を加えることができます。

${ parameter :- word }
デフォルト値への置換: パラメータ parameter が設定されていないか空の値を持つ場合、 word を展開した結果に置換されます。さもなければ、パラメータ parameter の値に置換されます。
${ parameter := word }
デフォルト値の代入: パラメータ parameter が設定されていないか空の値を持つ場合、 word を展開した結果が parameter に代入されます。最終的にパラメータ parameter の値に置換されます。内側の word をクォートすることは、フィールドの分割またはパス名の拡張を防ぎません。変数のみで、位置パラメータや特殊パラメータは、この方法で代入することはできません。
${ parameter :?[ word] }
空か設定されていないときにエラーとする: パラメータ parameter が設定されていないか空の値を持つ場合、 word を展開した結果 ( word が省略された場合にはパラメータが設定されていないことを表すデフォルトのメッセージ) が標準エラー出力に書き込まれ、シェルは、非 0 の終了ステータスで終了します。それ以外の場合、パラメータ parameter の値に置換されます。対話的シェルの場合は、必ずしも終了しません。
${ parameter :+ word }
代替値の使用: パラメータ parameter が設定されていないか空の値を持つ場合、空の値に置換されます。そうでなければ、 word を展開した結果に置換されます。

以上のパラメータ展開において、`:' を用いた場合は、パラメータが設定されていないかまたは空の値であることが検査され、`:' を省略するとパラメータが設定されていないことのみを検査します。

word は、閉じ大括弧をクォートするバックスラッシュが、クォートの取り外しの間に、削除されることを除いて、囲まれている (クォートされていない、ダブルクォートされる、または、ヒアドキュメント) からクォートのタイプを継承します。

${# parameter }
文字列の長さ: parameter の値の (文字列としての) 長さに置換されます。

以下の 4 通りのパラメータ展開は、部分文字列切り出し処理を行います。各場合において、パターンは、正規表現ではなく、パターンマッチ記法 ( 「シェルパターン」 の項を参照) が用いられます。パラメータが * または @ の場合、展開の結果がどうなるかは規定しません (unspecified)。パラメータ展開全体をダブルクォートで囲んでもパターンは、引用されません。中括弧のなかで引用することによりパターンを引用することができます。

${ parameter % word }
最短後置パターンの削除: まず word が展開され、その結果をパターンとして扱います。パラメータ parameter の右から、パターンに一致する最短の部分を削除した文字列に置換されます。
${ parameter %% word }
最長後置パターンの削除: まず word が展開され、その結果をパターンとして扱います。パラメータ parameter の右から、パターンに一致する最長の部分を削除した文字列に置換されます。
${ parameter # word }
最短前置パターンの削除: まず word が展開され、その結果をパターンとして扱います。パラメータ parameter の左から、パターンに一致する最短の部分を削除した文字列に置換されます。
${ parameter ## word }
最長前置パターンの削除: まず word が展開され、その結果をパターンとして扱います。パラメータ parameter の左から、パターンに一致する最長の部分を削除した文字列に置換されます。

コマンド置換

コマンド置換によって、コマンド名自体の代わりにコマンドの出力を置き換えることができます。コマンド置換は、次のように、コマンド (command) が囲まれたき起こります:

$( command )

またはバッククォートバージョン:

` command `

とした場合に行われます。シェルは、command を実行し、command の標準出力で command を置き換え、置換の終わりで 1 つ以上の改行シーケンスを削除することによって、コマンドを拡張します。最後以外の改行は、削除しません。ただし、フィールド分割の際に、 IFS の値や引用のされかたによっては、ここで残った改行文字が結局は、空白に置換されることもあります。組み込みコマンド jobid, jobstrap が、親のシェル環境に関する情報を返し、コマンドの置換で唯一のコマンドであるなら、 times が、同じプロセスに関する情報を返すことを除いて、コマンドは、サブシェル環境で実行されます。

$( 形式のコマンドの置換がサブシェルで始まるなら、 $(( は、数式展開での曖昧さを回避するために、空白類によって分離されななければなりません。

数式展開

数式展開は、数式を評価し、その値を置換するためのメカニズムを提供しています。数式展開のための形式は、次の通りです:

$(( expression ))

数式 expression は、その中のダブルクォート文字が特別扱いを受けないという点を除いては、ダブルクォート文字で囲まれている文字列と同様に扱われます。シェルは、パラメータ展開、コマンド置換、数式展開とクォート削除のための expression 中のすべてのトークンを展開します。

許可された式は、以下のように要約された、C の式のサブセットです。

すべての値は、タイプ intmax_t にあります。
定数
10 進数、8 進数 ( 0 から始まる) と 16 進数 ( 0x から始まる) 整定数。
変数
シェル変数を読み込み書き込みでき、整定数を含むことができます。
単項演算子
! ~ + -
2 項演算子
* / % + - << >> < <= > >= == != & ^ | && ||
代入演算子
= += -= *= /= %= <<= >>= &= ^= |=
条件演算子
? :

数式の結果は、10 進数に置換されます。

空白類文字による分割 (フィールド分割)

特定のコンテキストで、パラメータ展開、コマンド置換と数式展開の後、シェルは、フィールド分割のためにダブルクォート内で起こらない展開と置換の結果をスキャンし、複数のフィールドの結果になるかもしれません。

空白類 (<空白>, <タブ>と<改行>) である、 IFS の文字は、 IFS 中の他文字と異なって扱われます。

単語の始めまたは終わりの IFS 中の空白類は、廃棄されます。

続いて、フィールドは、次のいずれかによって区切られます:

  1. それを囲む IFS 中の任意の空白類がある IFS 中の空白類でない文字。または、
  2. IFS 中の 1 つ以上の空白類の文字。

単語が IFS 中の空白類でない文字で終わるなら、この文字の後に空のフィールドはありません。

フィールドが区切られていないなら、単語は、廃棄されます。特に、単語がクォートされていない置換のみからなり、置換の結果が空であるなら、 IFS が空であっても、フィールドの分割によって削除されます。

パス名展開 (ファイル名生成)

-f フラグが設定されていなければ、フィールド分割が行われたあと、ファイル名生成が行われます。各単語は、スラッシュで区切られたパターンの列であるとみなされます。パス名展開処理において、単語は、条件を満たすファイルすべてのファイル名の列で置換されます。この各ファイル名は、単語の各パターン部分を、そのパターンに一致する文字列に置換することで生成されるものです。これには、2 つの制限があります: まず、パターンは、スラッシュを含む文字列には一致しません。次に、パターンは、そのパターンがピリオドで始まらないかぎり、ピリオドで始まる文字列に一致しません。次のセクションでは、「パス名展開」に使用されるパターン、サブストリング処理のための 4 種類のパラメータ拡張と case コマンドについて説明しています。

シェルパターン

パターンは、通常の文字とメタキャラクタからなります。通常の文字は、その文字そのものに一致します。メタキャラクタは、‘ *’, ‘ ?’と‘ [’です。これらの文字を引用すると、各々の特殊な意味を失います。コマンド置換や変数置換において、ドル記号やバッククォート文字がダブルクォート文字の中にない場合には、変数の値やコマンドの出力の中に、これらの特殊な文字が存在するかどうかが調べられ、それらがあれば、メタキャラクタとして扱われます。

アスタリスク文字 (‘ *’) は、どのような文字列とも一致します。クエスチョンマーク文字 (‘ ?’) は、任意の文字 1 文字と一致します。左大括弧 (‘ [’) は、文字クラスを開始します。文字クラスの最後は、右大括弧‘ ]’です。‘ ]’がないなら、‘ [’は、文字クラスの開始ではなく、‘ [’文字そのものに一致します。文字クラスは、大括弧内に出現するすべての文字に一致します。文字のロケール依存の範囲は、マイナス記号を使用して指定されます。名前付きクラスの文字 ( wctype(3) 参照) は、‘ [:’と‘ :]’で名前を囲むことよって指定されます。例えば、‘ [[:alpha:]]’は、単一の文字にマッチするシェルのパターンです。感嘆符 (exclamation point) (‘ !’) を文字クラスの最初の文字にすることによって、文字クラスの意味を反転します。キャレット (‘ ^’) は、同じ効果がありますが、標準的ではありません。

文字クラスに文字‘ ]’を含めるには、文字クラスの (‘ !’または‘ ^’があるなら、その後の) 最初の文字とします。文字クラスに‘ -’を含めるときも同様で、リストの最初もしくは最後に置きます。

組み込みコマンド

このセクションは、組み込みコマンドをリストしています。
:
終了ステータス 0 (真) を返すヌルコマンドです。
. file
指定されたファイル file に記述されたコマンドがシェルに読み込まれ、実行されます。 return コマンドが、 . コマンドの呼び出し元に返るのにも使われます。 file に‘ /’文字を含む場合、その通りに扱われます。そうでなければ、シェルは、 PATH を使用して、ファイルを検索します。 PATH を使用しても見つからない場合、カレントワーキングディレクトリを検索します。
[
test(1) と同等の組み込みコマンド。
alias [ name[ = string] ...]
name= string が指定されている場合、シェルは、名前 name を持つ値 string のエイリアスを定義します。単に name だけが指定されるなら、エイリアス name の値が表示されます。引数が指定されない場合、 alias は、定義されているすべてのエイリアスの名前と値を表示します ( unalias も参照)。エイリアスの値は、適切にクォートされており、シェルへ再入力するのに適しています。 「エイリアス」 サブセクションも参照してください。
bg [ job ...]
指定されたジョブ (指定されなかった場合は、現在のジョブ) を、続けてバックグラウンドで実行させます。
bind [ -aeklrsv][ key [ command]]
行編集のキーバインドを表示するか、または変更します。このコマンドは、 editrc(5) で説明されています。
break [ num]
「フロー制御構成」 のサブセクションを参照してください。
builtin cmd [ arg ...]
指定された組み込みコマンド cmd を実行します。シェル関数を同名の組み込みコマンドでオーバライドしたい場合に有用です。
cd [ -L | -P][ -e][ directory]
指定されたディレクトリ directory に移動します。 directory 無指定時は、 HOME で指定されるディレクトリに移動します。 directory/, . または .. のいずれでも開始しない場合、指定された directoryCDPATH 変数中のディレクトリリストから検索します。 CDPATH が設定されていない場合、カレントディレクトリを検索します。 CDPATH の形式は、 PATH と同様です。対話的シェルでは、ユーザが指定したディレクトリと異なる場所に移動した場合、 cd は、移動先のディレクトリ名を表示します。これは、 CDPATH の機構が動作した場合と、シンボリックリンクを辿った場合に発生します。

-P オプションが指定されるなら、 .. は、物理的に扱われ、シンボリックリンクは、 .. 部分が処理される前に解決されます。 -L オプションが指定されるなら、 .. は、論理的に扱われます。こちらがデフォルトになっています。

-e オプションによって、 cd は、新しいディレクトリのフルパス名が正確にまたは少しも決定できないなら、終了ステータス 1 を返します。通常、これは、エラーと見なされませんが、警告は、印刷 (表示) されます。

chdir
cd 組み込みコマンドと同義語です。
command [ -p][ utility [ argument ...]]
command [ -p] -v utility
command [ -p] -V utility
呼び出しの最初の形式は、検索でのシェル関数を無視して、指定された utility を実行します。 utility が特別の組み込み関数であるなら、まるで正規の組み込み関数のように、実行されます。

-p オプションが指定されるなら、コマンド検索は、標準のユーティリティのすべてを見つけるために保証された PATH のデフォルト値を使用して実行されます。

-v オプションが指定されるなら、 utility は、実行されませんが、シェルによって解釈された記述が印刷 (表示) されます。普通のコマンドでは、出力は、パス名です。シェルの組み込みコマンド、シェル関数とキーワード関しては、名前だけが書き込まれます。エイリアスは、“ alias name= value”として印刷 (表示) されます。

-V オプションは、出力を除いて -v と同様です。それは、“ utility is description”を印刷 (表示) します、ここで、 description は、 utility へのパス名、特別なシェル組み込み、シェル組み込み、シェル関数、シェルキーワードまたは value のエイリアスです。

continue [ num]
「フロー制御構成」 のサブセクションを参照してください。
echo [ -e | -n][ string ...]
標準出力に空白で分離された引数のリストを印刷し、改行を追加します。
-n
最後の改行文字を抑制します。
-e
C 風のバックスラッシュエスケープシーケンスを処理します。 echo コマンドは、次の文字エスケープを理解します:
\a
警告 (端末ベルを鳴らす)
\b
バックスペース
\c
最後の改行文字を抑制します (改行文字が最後の文字でない場合、行が縮んでしまうという副作用があります)
\e
ESC 文字 (ASCII 0x1b)
\f
フォームフィード
\n
改行
\r
復改
\t
水平タブ
\v
垂直タブ
\\
バックスラッシュ文字
\0nnn
(この 0 は、ゼロです) 8 進数値が nnn である文字

string がクォートで括られていない場合、シェルからエスケープするためには、バックスラッシュ自身をバックスラッシュでエスケープする必要があります。例えば、次の通りです:

$ echo -e "a\vb" 
a 
 b 
$ echo -e a\\vb 
a 
 b 
$ echo -e "a\\b" 
a\b 
$ echo -e a\\\\b 
a\b

-e-n オプションのうち、どちらか片方のみを指定できます。

eval string ...
指定されたすべての引数を空白で結合し、その結果を解析し直してからコマンドとして実行します。
exec [ command [ arg ...]]
command が省略されない場合、そのシェルプロセスは、指定されたプログラム (それは、シェル組み込みコマンドや関数ではない、本物のプログラムでなければなりません) に置き換えられます。 exec コマンドにおけるリダイレクトは、永久性を持つと見なされ、 exec コマンド完了後にも引き続き効力を持ちます。
exit [ exitstatus]
シェルを終了します。 exitstatus が指定されるなら、これは、シェルの終了ステータスになります。そうでなければ、シェルが EXIT トラップを実行しているなら、トラップの前の最後のコマンドの終了ステータスが使用されます。シェルがシグナルのためのトラップを実行しているなら、シェルは、それ自体にシグナルを再送することによって、終了します。そうでなければ、前のコマンドの終了ステータスが使用されます。終了ステータスは、0 と 255 の間の整数であるべきです。
export name ...
export [ -p]
それ以後にシェルから実行されるコマンドの環境に、指定された名前の変数が含まれるようにします (変数のエクスポート)。変数のエクスポートを取り消す唯一の方法は、変数を unset することです。以下のように記述することで、エクスポートすると同時に変数の値を設定することができます。

export name= value

引数を指定しないなら、 export コマンドは、すべてのエクスポートされている名前を表示します。 -p オプションが指定されるなら、エクスポートされている変数は、一行毎に“ export name= value”という形式で表示されます。これは、シェルへ再入力するのに適しています。

false
非 0 の (偽) の終了値を返すヌルコマンド。
fc [ -e editor][ first [ last]]
fc -l [ -nr][ first [ last]]
fc -s [ old= new][ first]
fc 組み込みコマンドは、対話的シェルにそれ以前に入力されたコマンドの内容を、表示、編集、再実行します。
-e editor
編集に際し、指定されたエディタ editor を使用します。 editor 文字列は、 PATH を通して検索できるコマンド名です。 -e が指定されなかった場合は、変数 FCEDIT の値が使用されます。 FCEDIT が空であるか設定されていないなら EDITOR の値が使用されます。 EDITOR が空であるか設定されていないなら ed(1) が使用されます。
-l (エル)
エディタを起動せずに、コマンド履歴 (ヒストリ) の内容を一覧出力します。パラメータ firstlast で指定した範囲のコマンドが順に (出力の順番は、 -r オプションの影響を受けます) 出力されます。各コマンドの出力の際にはコマンド番号が付加されます。
-n
-l で一覧出力する際にコマンド番号を付加しません。
-r
コマンド一覧時 ( -l オプション指定時) や編集時 ( -l-s も指定されなかった場合) の順序を反転します。
-s
エディタを起動せずにコマンドを再実行します。
first
last
一覧出力や編集の対象となるコマンドを選択します。アクセス可能なコマンドの数は、変数 HISTSIZE の値で決まります。 first または last、または両方の値は、以下のいずれかの形式で指定します:
[ +] num
正の数で、コマンド番号を指定します。コマンド番号は、 -l オプションで表示させて調べることができます。
- num
負の数は、 num 個だけ現在から遡ったコマンドを指定します。たとえば、-1 は、直前に実行されたコマンドを指定します。
string
文字列 string は、過去に実行されたコマンドのうち、その文字列から始まる最新のものを指定します。もし -s オプションが指定されて old= new が指定されていなければ、最初のオペランドにイコール記号を含めることはできません。

次の変数は、 fc の実行に影響を与えます:

FCEDIT
履歴 (ヒストリ) 編集に使用するエディタの名前。
HISTSIZE
アクセス可能なコマンド数
fg [ job]
指定されたジョブ job または現在のジョブをフォアグラウンドに移動します。
getopts optstring var
POSIX に準拠した getopts コマンドです。この getopts コマンドにより、以前の getopt(1) コマンドの必要性は、減少しました。最初の引数は、文字の列です。各文字の後ろにはコロンをつけることができ、そのオプションが引数をとることを指示します。指定された変数に、解析され見つかったオプションが設定されます。見つかったオプションの次の引数のインデックスは、シェル変数 OPTIND に格納されます。あるオプションが引数をとる場合、その引数は、シェル変数 OPTARG に置かれます。有効でないオプションに出くわすと、変数 var には‘ ?’がセットされます。 getopts は、オプション群の末尾に到達すると偽の値 (1) を返します。
hash [ -rv][ command ...]
シェルは、コマンドの位置を保持するハッシュテーブルを維持管理しています。 hash コマンドに引数が指定されなかった場合、このテーブルの内容が出力されます。

引数を指定した場合、 hash コマンドは、指定した command をハッシュテーブルから削除し (それらが、関数ではない場合)、その後でそのコマンドを検索します。 -v オプションを指定した場合、 hash は、発見したコマンドの位置を表示します。 -r オプションを指定した場合、 hash は、関数以外のすべてのエントリをハッシュテーブルから削除します。

jobid [ job]
ジョブ job 中の各プロセスのプロセス ID を表示します。引数 job が省略された場合、現在のジョブに対して処理を行います。
jobs [ -lps][ job ...]
指定されたジョブの情報を表示します。 job 引数が指定されなかった場合は、全てのジョブの情報を表示します。情報には、ジョブ ID、ステータス、コマンド名が含まれます。

-l オプションが指定されるなら、各々のジョブの PID も表示されます。 -p オプションが指定されるなら、プロセスグループのリーダのためのプロセス ID だけが 1 行あたり 1 つ印刷 (表示) されます。 -s オプションが指定されるなら、ジョブコマンドの PID だけが 1 行あたり 1 つ印刷されます。

kill
ジョブへのシグナルの送信のサポートを追加した kill(1) の同等物です。
local [ variable ...][ -]
「関数」 を参照してください。
printf
組み込みの printf(1) と同等物。
pwd [ -L | -P]
カレントディレクトリのパスを表示します。組み込みコマンド版は、カレントディレクトリ名を覚えており、表示するときに再計算しないので、組み込みコマンド版は、同名のプログラムとは異なった表示をする場合があります。このため処理は高速ですが、カレントディレクトリの名前を変更した場合でも、組み込み版の pwd(1) は、以前のディレクトリ名を表示し続けます。

-P オプションが指定されるなら、シンボリックリンクは、解決されます。 -L オプションが指定されるなら、カレントディレクトリは、シェルの表記で表示されます (シンボリックリンクは、解決されません)。こちらがデフォルトです。

read [ -p prompt][ -t timeout]
[ -er] variable ... -p オプションが指定され、かつ標準入力が端末の場合、 prompt をプロンプトとして表示します。そして標準入力から 1 行入力します。行端の改行文字を削除し、行を前述の 「空白類文字による分割 (フィールド分割)」 の方法に従って分割し、各単語を、variable... で指定する各変数に順に代入します。もし、指定された変数の数より分割された単語の数が多ければ、最後の変数に残りの単語すべて ( IFS の文字を区切りにしてそれらも一緒に) が代入されます。分割された単語の数より多くの変数が指定されていたなら、余った変数には空文字列が設定されます。

-r オプションが指定された場合を除き、バックスラッシュは、特別に扱われます。バックスラッシュ文字が改行文字の直前にある場合、バックスラッシュ文字と改行文字は、削除されます。その他の文字の直前にバックスラッシュがある場合、バックスラッシュは、削除され、文字が IFS に含まれていても、含まれていないかのように扱われます。

-t オプションが指定され、完全な行の入力が供給される前に、 timeout が経過するなら、 read コマンドは、あたかもどんな値も割り当てずに、 SIGALRM によって終了するかのような終了ステータスを返します。 timeout 値の後には、オプションで‘ s’, ‘ m’または‘ h’のいずれかの一文字を付けることが出来、それぞれ秒・分・時間を陽に指定します。どれも指定しない場合には、‘ s’であるものとします。

-e オプションは、古いスクリプトとの後方互換性のためだけにあります。

終了ステータスは、成功すれば、0、ファイルの終りなら、1、エラーが生じるなら、2 と 128 の間、そしてトラップされたシグナルが read に割り込むなら、128 を超えた値です。

readonly [ -p][ name ...]
name で指定された変数を読み込み専用とし、あとで値を変更したり unset したりすることができないようにします。以下のように記述することで、変数を読み込み専用と宣言するのと同時に値を設定することも可能です:

readonly name= value

引数が指定されない場合、 readonly コマンドは、読み込み専用になっている変数の名前の一覧を表示します。 -p オプションが指定されるなら、読み込み専用になっている変数を、一行毎に“ readonly name= value”の形式で表示します。これは、シェルに再入力するのに適しています。

return [ exitstatus]
「関数」 を参照してください。
set [ -/+abCEefIimnpTuVvx][ -/+o longname][ -c string]
[ -- arg ...] set コマンドは、3 通りの異なった機能を実行します:
  • 引数がなければ、すべてのシェル変数の値を表示します。
  • 縮約形か“ -/+o longname”形式を使用してオプションが指定されるなら、 「引数リストの処理」 のセクションで説明されているように、指定されたオプションの設定またはクリアを行います。
  • --”オプションが指定されるなら、 set は、シェルの位置パラメータを、引き続く引数で置き換えます。“ --”オプションの後に引数が続かない場合、すべての位置パラメータは、クリアされ、“ shift $#”コマンドを実行するのと等価になります。位置置換パラメータとして引数を指定するとき、“ --”フラグは、省略可能です。これはお勧めできません。なぜなら、最初の引数は、マイナス記号 (‘ -’) またはプラス記号 (‘ +’) で開始するかもしれないからです。これらは、 set コマンドが、オプションの有効化または無効化の要求であると解釈してしまいます。
setvar variable value
変数 variable に値 value を代入します。 setvar コマンドは、関数内で、パラメータとして渡された名前を持つ変数に値を代入するためのものです。一般的に、 setvar を使うよりも“ variable= value”と書くほうが望ましいといえます。
shift [ n]
位置パラメータを n 回シフトします。 n を指定しない場合 1 回シフトします。 1 回のシフトにより、 $2 の値が $1 に、 $3 の値が $2 に代入されます (以下同様)。また、 $# の値は、1 減少します。 0 の位置パラメータがあるなら、shift は、何も行いません。
test
test(1) と同等の組み込みコマンド。
times
シェルプロセスとその子供の実行に費やされた時間を印刷します。最初の出力行は、シェルプロセス自体のユーザとシステム時間を示し、 2 番目の行は、子供のためのユーザとシステム時間を含んでします。
trap [ action] signal ...
trap -l
シェルが指定されたシグナル signal を受けとったときに、 action を解析し実行するように設定します。シグナルは、シグナルの名前か番号で指定します。さらに、シェル終了時に実行される action を指定するために、擬似シグナル EXIT を使用可能です。 action は、空の文字列かダッシュ (‘ -’) を指定できます。空文字列の場合、指定されたシグナルは、無視され、省略した場合は、指定したシグナルを受けとったときデフォルトの処理を行います。 action を省略することは、互換性の理由のために、デフォルトのアクションを要求する別の方法ですが、この使用法は推薦されません。サブシェルまたはユーティリティ環境で、シェルは、trap された (しかし、無視されない) シグナルをデフォルトの動作として再設定します。シェルが起動したときにすでに無視されるように設定されていたシグナルに対して trap コマンドを使用しても効果はありません。

オプション -l によって trap コマンドは、有効なシグナル名のリストを表示します。

true

0 の (真) の終了値を返すヌルコマンド。
type [ name ...]
name をコマンドとして解釈し、コマンド検索の結果を出力します。出力される結果は、次の通りです: シェルのキーワード、エイリアス、特別なシェル組み込み、シェル組み込み、コマンド、痕跡つきエイリアス (tracked alias)、最後に not found (見つからず) があります。エイリアスについては、エイリアス展開の結果が出力されます。コマンドと痕跡つきエイリアスについては、そのコマンドの完全なパス名が印刷されます。
ulimit [ -HSabcdfklmnpstuvw][ limit]
リソースのリミット値 (リミット値については、 getrlimit(2) 参照) を設定あるいは表示します。 limit が指定されている場合、指定されたリソースが設定されます。それ以外の場合、現在のリソース設定値が表示されます。

-H が指定されるなら、ハードリミットが設定ないし表示されます。ハードリミット値を下げることは誰にでもできますが、それを増やすことができるのはスーパユーザだけです。オプション -S を指定した場合は、ソフトリミットになります。リミット値を表示する場合、 -S-H のいずれか一方だけしか指定できません。デフォルトでは、表示は、ソフトリミット、設定は、ハード/ソフトリミット両方です。

オプション -a を指定すると ulimit コマンドは、全リソースの設定値を表示します。この場合、パラメータ limit は、指定できません。

この他のオプションは、表示あるいは設定するリソースの種類を指定するものです。これらは、互いに排他的です。

-b sbsize
ソケットバッファサイズの最大値。バイト単位。
-c coredumpsize
コアダンプファイルの最大サイズ。 512 バイトのブロック単位。
-d datasize
プロセスのデータセグメントの最大サイズ。キロバイト単位。
-f filesize
ファイルの最大サイズ。 512 バイトブロック単位。
-k kqueues
このユーザ ID のための kqueue ( kqueue(2) を参照) の最大数。
-l lockedmem
プロセスがロックできるメモリサイズの最大値。キロバイト単位。
-m memoryuse
プロセスの常駐セットサイズの最大値。キロバイト単位。
-n nofiles
あるプロセスがオープンできるファイル記述子の最大数。
-p pseudoterminals
このユーザ ID のための疑似端末の最大数。
-s stacksize
スタックセグメントサイズの最大値。キロバイト単位。
-t time
各プロセスで消費できる CPU 時間の最大値。秒単位。
-u userproc
このユーザ ID で同時に走らせうる最大プロセス数。
-v virtualmem
1 プロセスあたりの最大仮想メモリサイズ。キロバイト単位。
-w swapuse
このユーザ ID に対する予約されるか、または使用されるスワップ領域の最大の量。キロバイト単位。
umask [ -S][ mask]
ファイル作成マスクを ( umask(2) 参照) を 8 進数か mask によって指定されたシンボリック ( chmod(1) 参照) 値に設定します。引数が省略された場合、現在のマスクの値が表示されます。 -S オプションが指定されるなら、出力は、シンボリックです、そうでなければ、出力は、8 進数です。
unalias [ -a][ name ...]
指定されたエイリアス名を削除します。 -a オプションが指定されるなら、すべてのエイリアスを削除します。
unset [ -fv] name ...
指定された変数または関数を unset し、エクスポートされていない状態にします。 -v オプションが指定されるか、オプションが何も指定されなかった場合、 name 引数は、変数名として扱われます。 -f オプションが指定されるなら、 name 引数は、関数名として扱われます。指定された各 job が終了するのを待ち、指定された最後の job の最後のプロセスの終了ステータスを返します。指定されたあらゆる job がシェルに知られていないなら、それは、あたかも終了ステータス 127 で終了した既知のジョブように、扱われます。オペランドが与えられないなら、すべてのジョブが終了するのを待ち、 0 の終了ステータスを返します。

コマンド行編集

sh が端末から対話的に実行されている場合、現在入力中のコマンドおよびコマンド履歴 ( 「組み込みコマンド」fc 参照) を vi モードのコマンド行編集機能により編集することができます。このモードでは、 vi(1) のマニュアルページに説明されているコマンドのサブセットを用います。コマンド“ set -o vi” (または“ set -V”) により vi モードが有効になり、 sh は、 vi の挿入モードに移行します。 vi モードが有効にされている状態で、<ESC>キーをタイプすることによって、挿入モードとコマンドモードに sh を切り替えることができます。コマンドモードで<return>キーを叩くことで、行の内容がシェルに渡されます。

同様に、コマンド“ set -o emacs” (または“ set -E”) により emacs スタイルのコマンド行編集機能のサブセットを使うことができるようになります。

環境変数

次の環境変数は、 sh の実行に影響を与えます:
ENV
対話的なシェルのための初期設定ファイル。
LANG, LC_*
ロケール設定。これらは、シェルの子供によって継承され、シェル自体によって制限された方法で使用されます。
PWD
場合によりとシンボリックリンクを含むカレントディレクトリのための絶対パス名。これは、シェルによって使用され更新されます。
TERM
シェルのためのデフォルトの端末設定。これは、シェルの子供によって受け継がれて、ヒストリ編集モードで使用されます。

さらに、すべての環境変数は、 「特殊変数」 で説明されるように、シェルに影響する起動時にシェル変数に変化されます。

関連ファイル

~/.profile
ユーザのログインプロファイル。
/etc/profile
システムログインプロファイル。
/etc/shells
シェルデータベース。
/etc/suid_profile
特権があるシェルプロファイル。

終了ステータス

構文エラーのようなシェルによって検出されるエラーによって、シェルは、0 以外の終了ステータスで終了します。シェルが対話式のシェルでないなら、シェルファイルの実行は、中断されます。そうでなければ、シェルは、最後に実行されたコマンドの終了ステータスを返すか、または exit 組み込みコマンドに数値引数が使用されるなら、その引数を返します。

歴史

sh コマンド、Thompson シェルは、 Version 1 AT&T UNIX で登場しました。それは、名前 sh を継承した、Bourne シェルによって Version 7 AT&T UNIX で入れ替えられました。

このバージョンの sh は、 AT&T System V Release 4 UNIX の Bourne シェルの後に BSD ライセンスの下で 1989 年に書き直されました。

作者

このバージョンの sh は、最初に Kenneth Almquist によって書かれました。

バグ

sh ユーティリティは、UTF-8 以外のマルチバイト文字を認識しません。 IFS を使用して分割することと、行編集ライブラリ editline(3) は、マルチバイト文字を認識しません。
June 14, 2013 FreeBSD