名前 | 形式 | 機能説明 | 使用法 | 終了ステータス | ファイル | 属性 | 関連項目 | 警告 | 注意事項
/usr/bin/sh [-acefhiknprstuvx] [argument]...
/usr/xpg4/bin/sh [± abCefhikmnoprstuvx] [± o option]... [-c string] [arg]...
/usr/bin/jsh [-acefhiknprstuvx] [argument]...
/usr/bin/sh ユーティリティは、端末またはファイルから読み取られたコマンドを 実行するコマンドおよびプログラミング言語です。
/usr/xpg4/bin/sh ユーティリティは標準に準拠したシェルです。このユーティリティは ksh(1) のすべての機能を提供します。ただし、ksh(1) で説明しているように、動作が異なる場合を除きます。
jsh ユーティリティは、sh のすべての機能を備えた、かつジョブ制御を可能にするシェルへのインタフェースです ( 下記の「ジョブ制御」を参照 ) 。
シェルへの引数については、後述の「呼び出し」にリストされています。
ブランク ( blank) はタブ ( tab ) または空白文字 ( space ) です。名前 ( name) は ASCII 英文字、数字、または下線の並びで、先頭文字は英文字または下線です。パラメタ ( parameter) は、名前、複数、または *、@、#、?、–、$、! などの文字のいずれかです。
単純コマンド ( simple-command) は、ブランクで区切られた、ブランクでないワードの並びです。先頭のワードは、実行するコマンド名を指定します。残りのワードは、以下にことわりのない場合を除き、呼び出されたコマンドに引数として渡されます。コマンド名は引数 0 として渡されます (exec(2) を参照)。単純コマンドの値 ( value) は、正常終了した場合は終了ステータス、異常終了した場合は 200+status (8 進数 ) です。ステータス値の一覧表については、signal.h(3HEAD) を参照してください。
パイプライン (pipeline) は、パイプ (|) で区切られた 1 つ以上のコマンドの並びです。最後のコマンドを除き、各コマンドの標準出力は pipe(2) によってその次のコマンドの標準入力と結合されます。各コマンドは、別々のプロセスとして実行されます。シェルは最後のコマンドが終了するのを待ちます。最後のコマンドの終了ステータスが パイプライン全体の終了ステータスとなります。
リスト (list) は、; 、&、&&、または | | で区切られた 1 つ以上のパイプライン の並びです。その並びの終わりに ;または & を記述することもできます。これら 4 つの記号の中で、; と & の優先度は同じで、&& と | | の優先度より低くなります。&& と | | の優先度は同じです。セミコロン (;) によって、直前のパイプラインが順次実行されます。つまりシェルはパイプラインが終了するのを待ってから、セミコロンの後のコマンドを実行します。アンパサンド記号 (&) によって、直前のパイプラインが非同期的に実行されます。つまりシェルはパイプラインが終了するのを待ちません。&& (または | |) という記号によって、直前のパイプラインが ゼロ (または ゼロ以外) の終了ステータスを返した場合にだけ、その後のリストが実行されます。コマンドの区切りとして、セミコロンの代わりに任意の数の復帰改行を list に指定できます。
コマンドは、単純コマンドまたは以下のいずれかです。特に断わりのないかぎり、コマンドが返す値は、そのコマンド中で最後に実行された単純コマンドの値です。
for コマンドが実行されるたびに、name は in word リストから次に得られる word に設定されます。in word . . . を省略すると、for コマンドは、設定された各定位値パラメタに対して、do list を 1 回実行します (後述の「パラメタ置換」を参照)。in word リストの word がなくなると、実行は終了します。
case コマンドは、word に一致する最初の pattern に対応した list を実行します。パターンの形式は、ファイル名生成に使用される形式と同じです ( 「ファイル名の生成」の項を参照 ) 。ただしスラッシュ、先行するドット、およびスラッシュ直後のドットは、明示的に一致しなくてもかまいません。
if list ; then list [ elif list ; then list ; ] . . . [ else list ; ] fi
if の後の list を実行後、list が 0 の終了ステータスを返すと、最初の then の後の list を実行します。それ以外の場合、elif の後の list を実行します。この値が 0 の場合、次の then の後の list を実行します。これが失敗すると、else list を実行します。else list も then list も実行しない場合、if コマンドは 0 の終了ステータスを返します。
while コマンドは、while list を繰り返し実行し、list 中の最後のコマンドの終了ステータスが 0 の場合、do list を実行します。それ以外の場合、ループは終了します。do list 中のコマンドを実行しない場合、while コマンドは 0 の終了ステータスを返します。ループ終了条件の判定を逆にするには、while の代わりに until を使用します。
サブシェル内の list の実行
現在の ( つまり、親 ) シェル内での list の実行。記号 { の後には空白が必要です。
name が参照する関数を定義します。{ と } の間のコマンド群 ( list) が関数の本体となります記号 { の後には空白が必要です。関数の実行については「実行」の項で後述します。関数の本体が、上記の「コマンド」の項で 定義したようなコマンドの場合、{ および } は必要ではありません。
下記のワードは、コマンドの最初に現れたとき、およびクォートされずに記述されたときに認識されます。
if then else elif fi case esac for while until do done { }
# でワードを始めると、そのワードおよび以降の 復帰改行までの文字がすべて無視されます。
シェルは、2 つの逆引用符 (``) で囲まれた文字列から コマンドを読み取ります。これらのコマンドからの標準出力は、ワードの一部または全体として使用できます。標準出力上で最後につく復帰改行は削除されます。
文字列は、読み取られる前にはいっさい解釈されません。ただし例外として、文字のエスケープに使用されるバックスラッシュ (\) の削除だけは行われます。バックスラッシュは、逆引用符 (`) または別のバックスラッシュ (\) をエスケープするためにも使用され、コマンド文字列の読み取り前に削除されます。逆引用符をエスケープすることにより、コマンド置換のネストが可能になります。コマンド置換が、一対の二重引用符に囲まれている場合 (" . . . ` . . . ` . . . ") 、二重引用符をエスケープしているバックスラッシュ (\") は削除されますが、それ以外のバックスラッシュはそのまま残されます。
復帰改行文字のエスケープにバックスラッシュを用いた場合は (\newline)、バックスラッシュと復帰改行の両方が削除されます ( 後述の「クォート」の項の後半を参照 )。さらに、ドル記号 (\$) をエスケープしているバックスラッシュも削除されます。コマンド文字列に対するパラメタの置換は 読み取り前には行われないので、バックスラッシュでドル記号をエスケープしようとしても 無意味です。\、`、"、復帰改行 (newline)、および $ 以外の文字の前に付くバックスラッシュは、コマンド文字列の読み取り時にもそのまま残ります。
文字 $ は、置換可能なパラメタ ( parameters) を示します。パラメタには、定位置パラメタとキーワードパラメタの 2 種類があります。パラメタが数字の場合、これは定位置パラメタです。定位置パラメタには、set コマンドによって値を割り当てられます。キーワードパラメタ ( 変数とも呼ばれる ) には、以下の記述により値を代入することもできます。
name=value [ name=value ] . . .
value に対しては、パターンマッチングは行われません。同じ name を持つ関数と変数が存在することはできません。
パラメタの値 (もしあれば) は置換されます。中括弧が必要となるのは、パラメタの後に、その名前の一部として解釈すべきでない文字、数字、または下線を指定するときだけです。parameter が * または @ の場合、$1 で始まる定位値パラメタはすべて (空白で区切られて) 置換されます。$0 パラメータには、シェル起動時に 0 番目の引数から値を設定します。
parameter が NULL 以外の値に設定されている場合、その値に置き換えられます。その他の場合、word に置き換えられます。
parameter が設定されていない場合、または NULL に設定されている場合、それを word に設定します。次に、パラメタの値を置き換えます。この方法で定位値パラメタに値を代入することはできません。
parameter が NULL 以外の値に設定されている場合、その値に置き換えられます。その他の場合、word を出力しシェルを終了します。word を省略すると、メッセージ “parameter null or not set” が出力されます。
parameter が NULL 以外の値に設定されている場合、word に置き換えられます。その他の場合は置換を行いません。
上記にあるように、word は、代入用文字列として使用する場合にだけ評価されます。たとえば次の例では、pwd が実行されるのは、d が設定されていないかあるいは NULL に設定されている場合だけです。
echo ${d:-`pwd`} |
上記の式からコロン (:) を省略すると、シェルは parameter が設定されているかどうかだけをチェックします。
次のパラメータは、シェルが自動的に設定します。
定位置パラメータ数 (10 進数)
呼び出し時に、または set コマンドによってシェルに与えられたフラグ
最後に同期実行されたコマンドが返した 10 進数
このシェルのプロセス番号
最後に呼び出されたバックグラウンドコマンドのプロセス番号
次のパラメタはシェルによって使用されます。このセクションのパラメタは、環境変数とも呼ばれます。
cd コマンドのデフォルト引数 (ホームディレクトリ)。login(1) によって、パスワードファイルから ユーザーのログインディレクトリに設定されます (passwd(4) を参照)。
コマンド用検索パス (後述の「実行」を参照)。
cd コマンドの検索パスを指定します。
このパラメタにメールファイルの名前がセットされていて、かつ MAILPATH パラメタが設定されていない場合、シェルは指定されたファイルにメールが到着するとユーザーに通知します。
このパラメタは、MAILPATH または MAIL パラメタで指定されたファイルへメールが到着したか否かを、シェルが何秒ごとにチェックするかを指定します。デフォルト値は 600 秒 (10 分 ) です。このパラメタの値として 0 が設定された場合、シェルは次のプロンプトを出す前に チェックを行います。
コロン (:) で区切ったファイル名のリスト。このパラメタが設定されると、指定されたいずれかのファイルに メールが到着するたびに、シェルはユーザーに通知します。各ファイル名の後には、% および更新時刻の変更時に出力されるメッセージを 指定することができます。デフォルトのメッセージは you have mail です。
1 次プロンプト文字列。デフォルトは “ $ ” です。
2 次プロンプト文字列。デフォルトは “ > ” です。
内部フィールドセパレータ。通常は空白文字、タブ、および復帰改行です (「ブランクの解釈」を参照)。
このパラメタにユーザーが書き込み可能な ファイル名が設定された場合、シェルは、実行された各シェルプロシージャごとのアカウンティングレコードをこのファイルに書き込みます。
シェルは、呼び出されると、このパラメタが示す名前が環境中に存在するかを確かめます (「環境」の項を参照)。
sh の実行に影響を与える次の環境変数についての詳細は、environ(5) を参照してください。LC_CTYPE および LC_MESSAGES。
シェルは、PATH、PS1、PS2、MAILCHECK、および IFS にデフォルト値を割り当てます。HOME および MAIL のデフォルト値は login(1) で設定します。
パラメタとコマンドの置換後、置換の結果内でフィールドセパレータ文字 (IFS で発見されるもの) を検索し、その文字が現れた位置で分割します。分割された各々が引数となります。明示的な NULL 引数 ("" または ' ') は保持されます。暗示的な NULL 引数 (値を持たないパラメータにより生じるもの) は削除されます。
シェルが解釈する特殊表記法によって、入出力をリダイレクションできます。以下は、単純コマンド内の任意の位置およびコマンドの前後に指定することができ、起動されたコマンドには引き渡されません。注: word または digit を使用する前にコマンドとパラメタの置換が発生します。
word というファイルを標準入力 ( ファイル記述子 0) として使用します。
word というファイルを標準出力 ( ファイル記述子 1) として使用します。ファイルが存在しない場合は作成します。ファイルが存在していれば、ファイルの長さを 0 にします。
word というファイルを標準出力として使用します。ファイルが存在する場合、(EOF までシークしたあと) そのファイルに出力を追加します。ファイルが存在しない場合は、ファイルを作成します。
word というファイルを読み取りおよび書き込み用に 標準入力としてオープンします。
word に対するパラメタおよびコマンド置換が行われた後、その結果得られた word と文字どおり一致する最初の行が現れるまで、または EOF に達するまでシェルへの入力が読み取られます。ただし << に - が付加されて指定された場合は、以下のようになります。
まず、シェルへの入力の読み取り前に ( ただしパラメタとコマンドの置換後 ) 、先行するタブを word から取り除きます。
読み取ったシェルへの入力の各行を word と比較する前に、その行から先行するタブを取り除きます。そして、
その結果得られた word と文字どおり一致する最初の行が現れるまで、または EOF に達するまでシェルへの入力が読み取られます。
word 中のいずれかの文字がクォートされている場合 ( 後述の「クォート」を参照 ) 、シェルへの入力に対して追加処理は行われません。word 中のどの文字もクォートされていない場合は、以下のようになります。
まずパラメタとコマンドの置換を実施します。
エスケープされた復帰改行 ( \newline ) を削除します。
文字 \、$、および ` に対しては、\ を使ってクォートしなければなりません。
その結果得られるドキュメントが標準入力となります。
ファイル記述子 digit に対応するファイルを標準入力として使用します。同様に、標準出力への複製には >&digit を使用します。
標準入力をクローズします。同様に、標準出力については >&- を使用します。
上記のいずれかの前に数字が付く場合、その値が ( デフォルトの 0 または 1 の代わりに ) 該当ファイルに対応した ファイル記述子となります。次に例を示します。
... 2>&1 |
この例では、現在ファイル記述子 1 に関連しているファイルに、ファイル記述子 2 を関連付けます。
リダイレクトを指定する場合、記述する順序が重要になります。シェルは、リダイレクション記述を左から右へ評価します。次に例を示します。
... 1>xxx 2>&1 |
上記の例では、まず xxx というファイルにファイル記述子 1 を関連付けます。次に、ファイル記述子 1 に関連するファイル (つまり xxx) に、ファイル記述子 2 を関連付けます。リダイレクションの向きが逆であれば、まずファイル記述子 2 を端末に関連付け (ファイルを記述子 1 が既に端末に関連付けられているとみなし)、次にファイル記述子 1 をファイル xxx に関連付けます。
最初のページの「コマンド」の項で述べた用語を使って説明すると、以下のようになります。コマンドが複数の単純コマンドで構成される場合、リダイレクションは、個々の単純コマンドに対して行う前に、コマンド全体に対して評価されます。すなわち、シェルはまずリスト 全体に対してリダイレクションを評価し、次にリスト内の各パイプラインに対して評価し、次にパイプライン内の各コマンドに対して評価し、最後にコマンド内の各単純コマンドに対して評価します。
コマンドの後に & を指定すると、コマンドにおけるデフォルトの標準入力は /dev/null という空ファイルになります。その他の場合、コマンドを実行するための環境には、起動側シェルのファイル記述子 ( 入出力指定で変更可能 ) が含まれます。
コマンド実行に先立ち、各コマンドワードは、*、?、および [ を含んでいないかチェックされます。これらの文字のいずれかがあると、そのワードはパターンとみなされます。このワードは、パターンと一致する、辞書編集方式の順にソートされたファイル名に置換されます。パターンと一致するファイル名が見つからない場合、ワードは変更されません。ファイル名の先頭のピリオド (.) または スラッシュ (/) 直後のピリオドは、明示的に一致しなければなりません ( 後者の場合はスラッシュ自体をも含む ) 。
NULL 文字列を含め、任意の文字列と一致します。
任意の単一文字と一致します。
囲まれた文字のいずれかと一致します。2 つの文字を - で区切ると、その間にある任意の文字 ( その 2 つの文字も含む ) に一致します。先頭の [ の次の文字が ! である場合、[ ] で囲まれていない任意の文字と一致します。
クォートされているすべての文字 ( 下記「クォート」を参照 ) は、ファイル名において明示的に一致しなければなりませんので、ご注意ください。
次の文字はシェルに対しては特別な意味を持ち、クォートしない ( 後述の説明を参照 ) 限り ワードの終わりを表します。
; & ( ) | ^ < > 復帰改行 空白文字 タブ
これらの文字をクォートする、つまり文字自身を表すには、文字の前にバックスラッシュ (\) を付けるか、または一対の引用符 ( ' ' または "") で囲みます。シェルは、特定の文字をクォートして、それらが特別の意味を持たないようにすることがあります。単一の文字をクォートするのに用いるバックスラッシュは、コマンド実行前にワードから取り除かれます。\ と復帰改行との組み合せは、コマンドとパラメタの置換前にワードから取り除かれます。
一対の単一引用符 ( ' ') で囲まれたすべての文字 ( ただし単一引用符は除く ) は、シェルによってクォートされます。バックスラッシュは、一対の単一引用符で囲まれていれば特殊な意味を持ちません。単一引用符は、一対の二重引用符で囲めばクォートされますが ( 例 " '" ) 、一対の単一引用符で囲んでもクォートされません。
一対の二重引用符 ("") の中では、パラメタとコマンドの置換が実施され、シェルは、その結果をクォートして、ブランクの解釈とファイル名の生成が行われないようにします。$* が一組の二重引用符で囲まれている場合、定位置パラメタは置換され、クォートされ、クォートされた空白で分けられます ("$1 $2 . . .")。しかし $@ が一組の二重引用符で囲まれている場合は、定位置パラメタは置換され、クォートされ、クォートされていない空白で分けられます ("$1" "$2" . . . )。\ は \、`、"、, (コンマ)、$ といった文字をクォートします。\ と復帰改行との組み合せは、コマンドとパラメタの置換前にワードから取り除かれます。バックスラッシュが \、`、"、, (コンマ)、$、および 復帰改行以外の文字の前に付く場合は、バックスラッシュ自体がシェルによってクォートされます。
シェルは、対話的に使用すると、コマンドを読み取る前に PS1 の値によるプロンプトを発行します。復帰改行を入力したあとで、コマンドを完了するためにさらに入力が必要な場合は、2 次プロンプト (PS2 の値 ) が出力されます。
環境は、通常の引数リストが 実行されるプログラムに引き渡される場合と同様の方法で引き渡される、名前と値の対です ( environ(5) を参照)。シェルが環境と対話する方法はいくつかあります。シェルは、呼び出されると、環境を走査して、見つけた名前ごとに変数を作成し、対応する値を設定します。ユーザーがこれらのパラメタの値を変更したり 新しいパラメタを作成したときには、export コマンドを用いてシェルのパラメタを環境に関連付けなければ、これらのパラメタは環境に何の影響も与えません (set -a の説明を参照)。環境からパラメタを削除するには、unset コマンドを使用します。したがって、実行されるコマンドが参照する環境は、シェルが最初に引き継いだ「名前 = 値」の対のうち 変更されていないものから、unset によって削除された対を引き、変更または追加した対をくわえたものです。これらはいずれも export コマンドで指定する必要があります。
単純コマンドの環境は、いくつかのパラメタ代入指定を 先頭に付加すれば拡張できます。したがって、
TERM=450 command |
および
(export TERM; TERM=450; command |
は、command が特殊コマンドでなければ、command の実行に関するかぎり同じことを意味します。command が特殊コマンドの場合、
TERM=450 command |
の指定は、現在のシェル内の TERM 変数を修正します。
-k フラグを設定すると、すべてのキーワード引数は環境に格納されます。これらの引数がコマンド名の後に指定された場合も同様です。以下の例では、まず a=b c を、次に c を表示します。
echo a=b c a=b c set -k echo a=b c c |
起動されたコマンドに対する INTERRUPT シグナルと QUIT シグナルは、コマンドの後に & が付く場合には無視されます。その他の場合、シグナルは、シェルが親から引き継いだ値を持ちます。ただし、シグナル 11 だけは例外です ( 後述の trap コマンドの説明を参照 ) 。
コマンド実行のたびに、前述の コマンドの置換、パラメタの置換、ブランクの解釈、入出力のリダイレクション、およびファイル名の生成が行われます。コマンド名が定義済みの関数名と一致する場合、その関数がシェルプロセスで実行されます ( これと実行時にサブシェルを要求する シェルスクリプトファイルの実行の違いに注意 ) 。定義済み関数名とは一致しないが、後述の特殊コマンドの いずれかと一致するコマンド名の場合、そのコマンドがシェルプロセスで実行されます。
定位置パラメタの $1、$2、. . . は関数の引数に設定されます。コマンド名が特殊コマンドとも定義済み関数の名前とも一致しない場合、新しいプロセスが作成され、exec(2) を用いてそのコマンドの実行が試みられます。
PATH というシェルパラメタは、コマンドを含んでいるディレクトリの検索パスを定義します。ディレクトリ名は、コロン (:) で区切ります。デフォルトのパスは /usr/bin です。現在のディレクトリは NULL パス名によって指定されます。これは等号の直後、パスリスト内の任意の場所にある 2 つの区切り文字のコロンの間、またはパスリストの最後に記述できます。コマンド名に / が含まれている場合は、検索パスは使用されません。/ が含まれていなければ、パスにおける各ディレクトリに実行可能ファイルがあるか検索します。ファイルが実行権を有するが、それが a.out ファイルでない場合、シェルコマンドの入ったファイルとみなされます。そのファイルを読み取るときは、サブシェルが生成されます。括弧で囲まれたコマンドもサブシェル内で実行されます。
シェルは、( あとで不必要な exec を行わなくてもいいように ) 検索パス内のコマンドの位置を記憶します。コマンドが相対ディレクトリにあった場合、その位置を 現在のディレクトリの変更のたびに再決定しなければなりません。シェルは、PATH 変数が変更されるか hash -r コマンドが実行されるたびに、記憶していたすべての位置を忘れてしまいます (下記参照)。
これらのコマンドに対しては、入出力のリダイレクトが可能です。ファイル記述子 1 は、デフォルトの出力位置です。ジョブ制御が可能なときには、さらにいくつかの特殊コマンド がシェル環境に追加されます ( 「ジョブ制御」の項を参照 ) 。
コマンドは何もせず、影響は何もありません。終了状態 0 が返されます。
filename で示すファイルからコマンドを読み取り、それを実行し、戻ります。PATH で指定された検索パスを使用して、filename が存在しているディレクトリを見つけます。
ジョブ制御が可能なとき、bg コマンドはジョブの操作用に ユーザー環境に追加されます。停止状態のジョブをバックグラウンドで再び実行します。%jobid を省略すると、現在のジョブとみなされます。( 詳細については後述の 「ジョブ制御」の項を参照 )
for または while ループがあれば抜け出します。n を指定すると、n レベル分ブレークします。
現在のディレクトリを argument に変更します。シェルパラメタ HOME は、argument のデフォルト値です。シェルパラメタ CDPATH は、argument を含むディレクトリの検索パスを定義します。ディレクトリ名は、コロン (:) で区切ります。デフォルトのパスは空の文字列です (現在のディレクトリの指定)。注: 現在のディレクトリは 空のパス名で指定します。このパス名は、等号の直後か、パスリスト内にある区切り文字のコロンの間に指定します。argument の先頭文字が / の場合、検索パスは使用しません。それ以外の場合は、パス中の各ディレクトリで argument を検索します。
chdir はシェルの作業用ディレクトリを dir が示すディレクトリに変更します。引数を指定しないと、そのユーザーのホームディレクトリに変更します。dir が現在のディレクトリからは見つからない相対パス名の場合、変数 CDPATH 環境内のディレクトリリストを検索します。dir が / で始まる値を持つシェル変数の名前である場合、その変数の値が示すディレクトリに変更します。
for または while ループの次の繰り返しを実行します。n を指定すると、n 番目のループから実行します。
arguments の文字列が 空白文字に区切られて、シェルの標準出力に書かれます。使用法と説明については echo(1) を参照してください。
引数をシェルへの入力として読み取り、生成されるコマンドを実行します。
このシェルの代わりに、引数で指定されたコマンドを (新規プロセスは生成せずに) 実行します。入出力引数が指定可能で、 それら以外の引数を指定しない場合には、 シェルの入出力を変更します。
呼び出し元のシェル、またはシェルスクリプトを n で指定した終了ステータスで終了させます。n を省略すると、 最後に実行されたコマンドの終了状態 がシェルの終了状態になります。(EOF によっても、シェルは終了します。)
指定された name 群に対し、あとで実行されるコマンドの環境へ自動的にエクスポートされるようにマークを付けます。引数を省略すると、現在のシェル実行中にエクスポートのマークが付けられた 変数名を一覧表示します。親シェルからエクスポートされた変数名は、現在のシェル実行中に再びエクスポートされた場合にだけ 一覧表示されます。関数名はエクスポートされません。
ジョブ制御が可能なとき、fg はジョブの操作用に ユーザー環境に追加されます。このコマンドは、フォアグラウンド状態の停止ジョブを再び実行します。また、実行中のバックグラウンドジョブをフォアグラウンドへ移します。%jobid を省略すると、現在のジョブとみなされます。 ( 詳細については後述の 「ジョブ制御」の項を参照 )
コマンドシンタクス標準のサポート用に、シェルスクリプト内で使用されるコマンドです (Intro(1) を参照)。このコマンドは、定位置パラメタを構文解析し、オプションの正当性をチェックします。使用法と説明については、getoptcvt(1) を参照してください。
シェルは、name に指定されたコマンドごとに、検索パス内での位置を決定し、記憶します。-r オプションを指定すると、シェルは記憶したすべての位置を破棄します。引数をまったく指定しないと、記憶されたコマンドに関する情報が表示されます。Hits は、シェルプロセスによってコマンドが呼び出された回数を表します。Cost は、検索パスのコマンドを見つけるのに必要な作業領域です。コマンドが検索パスの「相対」ディレクトリにある場合、そのディレクトリの変更後に そのコマンドが格納された位置が再計算されます。この再計算が行われる予定のコマンドに対しては、hits 情報の隣にアスタリスク (*) が示されます。Cost の値は、再計算が行われるたびに増加されます。
停止中またはバックグラウンドで実行中の すべてのジョブを報告します。%jobid を省略すると、停止中またはバックグラウンドで稼動中の すべてのジョブが報告されます ( 詳細については後述の 「ジョブ制御」の項を参照 )
TERM (終了) シグナルまたは指定されたシグナルのいずれかを、指定されたジョブまたはプロセスに送信します。シグナルは、番号または名前 (signal.h(3HEAD) に示されるもので、ただし「SIG」という接頭辞を取り除いたもの (CHLD と名付けられる SIGCHD 以外)) で指定します。送信するシグナルが TERM (終了) または HUP (ハングアップ) の場合、停止中のジョブまたはプロセスには CONT (継続) シグナルを送信します。job という引数は、活動中のジョブではないプロセスのプロセス ID を指定することもできます。job の記述形式についての説明は、「ジョブ制御」の項を参照してください。第 2 の形式の kill -l は、シグナル番号とシグナル名をリスト表示します。(kill(1) 参照)。
`exec login argument. . . .' と同機能です。使用法と機能説明については login(1) を参照してください。
exec newgrp argument と同機能です。使用法と説明については、newgrp(1) を参照してください。
現在の作業用ディレクトリを表示します。使用法と説明については、pwd(1) を参照してください。
標準入力から 1 行を読み取り、内部フィールドセパレータの IFS ( 通常は空白文字またはタブ ) を用いてワード境界を区切り、最初のワードを最初の name に割り当て、2 番目のワードを 2 番目の name に割り当て、続くワードも順次割り当てます。残ったワードは最後の name に割り当てます。\ に続いて復帰改行 ( NEWLINE ) を入力すれば、行を継続できます。復帰改行以外の文字の前にバックスラッシュを付加すれば、その文字をクォートできます。このバックスラッシュは、ワードが name に割り当てられる前に削除され、 バックスラッシュの後に位置する文字は解釈されません。EOF に到達した場合を除き、リターンコードは 0 となります。
指定された name に「読み取り専用」のマークを付け、これらの名前が後続の割り当てでは変更できないようにします。引数を省略すると、読み取り専用と指定された名前がすべて一覧表示されます。
関数を、n が示すリターンステータスで終了させます。n を省略すると、リターンステータスは最後に実行されたコマンドのリターンステータスになります。
エクスポート用に修正または作成された変数にマークを付けます。
コマンドが 0 以外の終了ステータスで終了した場合、直ちに終了します。
ファイル名の生成を無効にします。
関数の定義時に、関数コマンドを検索しその位置を記憶します ( 通常、関数コマンドは関数実行時に検索されます ) 。
コマンド名の前にあるキーワード引数だけでなく、すべてのキーワード引数がコマンド用の環境に置かれます。
コマンドを読み取るが、実行しません。
コマンド 1 つを読み取って実行し、終了します。
未設定の変数を置換時にエラーとして扱います。
シェルへの入力行を読み取り時に表示します。
コマンドとその引数を実行時に表示します。
どのフラグも変更しません。$1 に – を設定する際に便利です。
- の代わりに + を使用すると、これらのフラグは無効になります。これらのフラグはシェル起動時にも使用できます。現在設定されているフラグは、$- で見ることができます。残りの引数は定位置パラメタで、次の順に割り当てられます。$1、$2、. . 。引数が指定されない場合、すべての名前の値が出力されます。
$n+1 . . . から始まる一連の定位置パラメタを、次の名前に再命名 (リネーム) します。$1 . . . 。 n を省略すると、1 とみなされます。
pid ( プロセス ID 番号 ) の実行を停止します (ps(1) 参照)。
現在のシェルがログインシェルでない場合、その実行を中断します。
条件式を評価します。使用法と説明については、test(1) を参照してください。
シェルから実行されたプロセスの ユーザーおよびシステム時間の累積値を出力します。
argument が示すコマンドを、シェルが数値または記号シグナル (n) を受信した時に読み取り実行します。(注意 : argument は、トラップ設定時に一度、トラップ取り出し時に一度検索されます。) トラップコマンドは、シグナル番号または 対応するシンボリック名の順序で実行されます。現在のシェルで無視されているシグナルにトラップを設定しようとしても無効となります。シグナル 11 ( メモリフォールト ) にトラップを指定しようとすると、エラーになります。argument を省略すると、すべてのトラップ n は元の値に再設定されます。argument が NULL 文字列の場合、シェルおよびシェルが呼び出したコマンドは、このシグナルを無視します。n が 0 の場合、argument が示すコマンドはシェル終了時に実行されます。引数なしの trap コマンドは、コマンドの一覧を 各々が対応しているシグナル番号とともに表示します。
name をコマンド名として使用した場合に どのように解釈されるかを表示します。
ulimit は、資源の強い制限値または弱い制限値を 表示または設定します。これらの制限値については getrlimit(2) の説明を参照してください。
limit 引数を省略すると、ulimit は指定されている制限値を表示します。制限値は一度にいくつでも表示できます。-a オプションは制限値すべてを表示します。
limit 引数を指定すると、ulimit は指定されたフラグに対応する制限値をその引数の値に設定します。limit 引数の値として unlimited という文字列を指定すると、有効な最大値に設定されます。一度に資源 1 つについてだけ制限値を設定できます。ユーザーは誰でも、弱い制限値を強い制限値を超えない任意の値に設定できます。また、強い制限値を下げることもできます。ただし、強い制限値を上げることができるのはスーパーユーザーだけです。su(1M) を参照してください。
-H オプションは強い制限値を表し、-S オプションは弱い制限値を表します。どちらのオプションも指定しない場合、ulimit は両方の制限値を設定し、弱い制限値を表示します。
以下のオプションは、制限値を表示または設定すべき資源を指定します。オプションをいっさい指定しないと、ファイルサイズ制限値を表示または設定します。
最大コアファイルサイズ (512 バイトブロック単位)
データセグメントまたはヒープの最大サイズ (K バイト単位)
最大ファイルサイズ (512 バイトブロック単位)
最大ファイル記述子に 1 を加えたもの
スタックセグメントの最大サイズ (K バイト単位)
最大 CPU 時間 (秒単位)
仮想記憶の最大サイズ (K バイト単位)
システムで利用可能な最大上限値を調べるには sysdef(1M) コマンドを実行してください。表示される値は 16 進数ですが、bc(1) コマンドを使って 10 進数に変換できます。swap(1m) を参照してください。)
たとえば、0 メガバイトに コアファイルダンプのサイズを 制限するには次のように入力します。
ulimit -c 0 |
ユーザーファイルの作成時のマスクを nnnk が示す値に設定します (umask(1) を参照)。nnn を省略すると、マスクの現在の値を出力します。
name ごとに、対応する変数または関数値を削除します。変数 PATH、PS1、PS2、MAILCHECK、および IFS は設定解除できません。
当該ユーザーのバックグラウンドプロセスのうち ID が n のプロセスを待ち、その終了ステータスを報告します。n が省略された場合、当該ユーザーの現在活動中のすべての バックグラウンドプロセスを待ち、リターンコードは 0 になります。
exec(2) を介してシェルが呼び出される場合で、引数 0 の先頭文字が – のとき、コマンドは、まず /etc/profile から読み込まれ、次に $HOME/.profile から読み込まれます (これらのファイルがある場合)。その後、コマンドは後述のように読み込まれます。シェルが /usr/bin/sh として呼び出される場合にも、このようになります。以下に述べるフラグは、呼び出し時にのみ、シェルによって解釈されます。注: -c または -s フラグが指定されないかぎり、先頭引数はコマンドを含むファイルの名前であるとみなされ、残りの引数は定位置パラメタとして そのコマンドファイルに引き渡されます。
このフラグが指定されると、string からコマンドを読み取ります。
このフラグが指定された場合あるいは シェル入出力が端末に接続されている場合、このシェルは対話型となります。この場合、kill 0 が対話型シェルを終了しないように TERM を無視し、wait が割り込み可能になるように INTERRUPT を捕え、無視します。いずれの場合も、シェルは QUIT を無視します。
このフラグが指定されると、シェルは実効ユーザーおよびグループ ID に、実ユーザーおよびグループ ID を設定しません。
-r フラグを指定すると、シェルは制限付きシェルになります (rsh(1M) を参照)。
このフラグが指定された場合または引数が残っていない場合、標準入力からコマンドを読み取ります。引数が残っていれば、それらは定位置パラメタを指定します。前述の特殊コマンドの出力を除くシェル出力は、ファイル記述子 2 に書き出されます。
他のフラグと引数については、前述の set コマンドの箇所で説明されています。
シェルを jsh として呼び出すと、sh の説明で述べたすべての機能に加えて、ジョブ制御が可能になります。通常、ジョブ制御は対話型シェルに対してだけ可能です。非対話型シェルは、ジョブ制御の機能が追加されても、その恩恵を受けないのが通常です。
ジョブ制御が可能な場合、ユーザーが端末から入力したコマンドまたはパイプラインは、すべてジョブ ( job) と呼ばれます。どのジョブも、必ず、次のいずれかの状態にあります。フォアグラウンド、バックグラウンド、または停止です。これらの用語の定義を次に示します。
フォアグラウンド状態にある ジョブは、制御している端末への読み取り および書き込み権を持っています。
バックグラウンド状態にあるジョブは、制御している端末への読み取り権を拒否されていますが、条件付き書き込み権は持っています (stty(1) を参照)。
停止ジョブは保留状態に置かれたジョブであり、通常は SIGTSTP シグナルにより、この状態になります (signal.h(3HEAD) を参照)。
シェルが起動するすべてのジョブには、ジョブ番号 ( job number) と呼ばれる 正の整数が割り当てられます。シェルはこの番号を把握し、特定のジョブを示す識別子として使用します。また、シェルは現在 ( current) および直前 (previous) のジョブも把握しています。現在のジョブとは、最後に起動または再起動されたジョブです。前回のジョブとは、その直前のジョブです。
ジョブ識別子の正しい構文は次のような形式です。
%jobid
このうち jobid は、次のいずれかの形式で指定できます。
現在のジョブ
前回のジョブ
string を含むコマンド行 (一意に表す) に対応したジョブを指定します。
ジョブ番号が n のジョブ
コマンド名の先頭が pref のコマンド。たとえば ls -l name がバックグラウンドで実行中だった場合、%ls と指定すればこのコマンドを示すことができます。pref は、クォートしない限り、ブランクを含めることができません。
ジョブ制御が可能なとき、ジョブの操作用に 次のコマンドがユーザー環境に追加されます。
停止状態のジョブをバックグラウンドで再び実行します。%jobid を省略すると、現在のジョブとみなされます。
停止状態のジョブをフォアグラウンドで再び実行します。また、実行中のバックグラウンドジョブをフォアグラウンドへ移します。%jobid を省略すると、現在のジョブとみなされます。
停止中またはバックグラウンドで実行中の すべてのジョブを報告します。%jobid を省略すると、停止中またはバックグラウンドで稼動中の すべてのジョブが報告されます次のオプションを使って、ジョブに関する表示を変更できます。
ジョブのプロセスグループ ID および作業ディレクトリを報告します。
ジョブのプロセスグループ ID のみを報告します。
コマンドまたは引数中に見つかった jobid を、対応するプロセスグループ ID に置き換え、コマンドに引数を渡して実行します。
kill コマンドの組み込みバージョン。jobid で示すプロセスに対して kill コマンドの機能を提供します。
バックグラウンドジョブの実行を停止します。
現在のシェルがログインシェルでない場合、その実行を中断します。
wait コマンドの組み込みバージョンで、ジョブ識別子の指定を受け入れます。%jobid が省略された場合、wait は、前述の「特殊コマンド」で説明したように動作します。
ファイルが 2 ギガバイト ( 231 バイト) 以上ある場合の sh と jsh の動作については、largefile(5) を参照してください。
構文エラーなどのエラーを検出すると、シェルは ゼロ以外の終了ステータスを返します。シェルを非対話型で使用している場合、シェルファイルの実行は中止されます。エラーがなければ、シェルは、最後に実行されたコマンドの終了ステータスを返します (前述の exit コマンドの説明を参照)。
シェルが jsh として呼び出された場合、停止ジョブがあるのにシェルを終了させようとすると、シェルは次のような警告を出します。
There are stopped jobs.
これが唯一のメッセージです。もう一度終了が試みられ、停止ジョブがまだ存在している場合、これらのジョブにカーネルから SIGHUP シグナルが送られ、シェルは終了します。
$HOME/.profile
/dev/null
/etc/profile
/tmp/sh*
次の属性については attributes(5) のマニュアルページを参照してください。
Intro(1), bc(1), echo(1), getoptcvt(1), kill(1), ksh(1), login(1), newgrp(1), pfsh(1), pfexec(1), ps(1), pwd(1), set(1), shell_builtins(1), stty(1), test(1), umask(1), wait(1), rsh(1M), su(1M), swap(1m), sysdef(1M), dup(2), exec(2), fork(2), getrlimit(2), pipe(2), ulimit(2), setlocale(3C), signal.h(3HEAD), passwd(4), profile(4), attributes(5), environ(5), largefile(5), XPG4(5)
シェルスクリプトを setuid して使用することは避けてください。
入出力のリダイレクションでファイル名に使用されたワードは、ファイル名生成では解釈されません ( 上記の「ファイル名の生成」の項を参照 ) 。たとえば cat file1 >a* という指定は、a* という名前のファイルを生成します。
パイプラインにあるコマンド群は それぞれ別個のプロセスとして稼動するので、パイプラインに設定された変数は親シェルには何の影響も与えません。
while ループまたは until ループの入力または出力をリダイレクトする場合、ループ内のコマンドはサブシェルで実行されます。サブシェル内で設定または変更された変数は、親プロセスでは効力を失います。
lastline= while read line do lastline=$line done < /etc/passwd echo "lastline=$lastline" # lastline は空です。 |
このような場合、入力または出力をリダイレクトするには、次の例のように exec を使用します。
# ファイル記述子 0 の標準入力をファイル記述子 3 # のファイルとして保存して、 # そのファイルから標準入力をリダイレクトします。 /etc/passwd: exec 3<&0 # fd 0 の標準入力を fd 3 として保存します。 exec </etc/passwd # ファイルから入力をリダイレクトします。 lastline= while read line do lastline=$line done exec 0<&3 # 標準入力を元に戻します。 exec 3<&- # fd 3 を閉じます。 echo "$lastline" # lastline は空ではありません。 |
cannot fork,too many processes というエラーメッセージを受け取った場合には、wait(1) コマンドを用いてユーザーのバックグラウンドプロセスをクリーンアップしてください。それでも効果がない場合には、おそらくシステム・プロセステーブルが満杯であるか、または活動中のフォアグラウンドプロセスがありすぎるためです。ユーザーログインに結合するプロセス ID の数、およびシステムが把握できる数には 限度があります。
パイプラインの最後のプロセスだけが、待つ対象になり得ます。
あるコマンドを実行し、その後で同一名のコマンドが、検索パスにおいて元のコマンドがあるディレクトリの前に位置するディレクトリにインストールされた場合、シェルは元のコマンドの方を実行し続けます。新しい方のコマンドを実行させたければ、hash コマンドを使用してください。
Bourne シェルにはプロセスの実効ユーザー ID に対して制限があります。このユーザー ID が 100 よりも小さい (さらにプロセスの実ユーザー ID と同等ではない ) 場合には、ユーザー ID はプロセスの実ユーザー ID にリセットされます。
同じプロセスグループで フォアグラウンドジョブと バックグラウンドジョブの両方を シェルが実行しているため、ジョブは同じシグナルを受け取り、予期しない結果を招くことがあります。したがって、特に対話型のシェルを動作している場合は、他のジョブ制御のシェルを使用することを おすすめします。
存在しないコマンドのインタプリタを実行しようとするシェルスクリプトを、シェルが処理した場合、シェルは、シェルスクリプトが存在しないという間違った診断メッセージを返します。
名前 | 形式 | 機能説明 | 使用法 | 終了ステータス | ファイル | 属性 | 関連項目 | 警告 | 注意事項