Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
Copyright 1989 AT&T
Portions Copyright (c) 1992, X/Open Company Limited All Rights Reserved
Sun Microsystems, Inc. gratefully acknowledges The Open Group for permission to reproduce portions of its copyrighted documentation. Original documentation from The Open Group can be obtained online at http://www.opengroup.org/bookstore/.
The Institute of Electrical and Electronics Engineers and The Open Group, have given us permission to reprint portions of their documentation. In the following statement, the phrase "this text" refers to portions of the system documentation. Portions of this text are reprinted and reproduced in electronic form in the Sun OS Reference Manual, from IEEE Std 1003.1, 2004 Edition, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2004 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group. In the event of any discrepancy between these versions and the original IEEE and The Open Group Standard, the original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.opengroup.org/unix/online.html. This notice shall appear on any product containing this material.
/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 ユーティリティーは標準に準拠したシェルです。このユーティリティーは ksh88(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 つの記号の中で、; と & の優先度は同じで、&& と |\|| の優先度より低くなります。&& と |\|| の優先度は同じです。セミコロン (;) によって、直前のパイプラインが順次実行されます。つまりシェルはパイプラインが終了するのを待ってから、セミコロンの後のコマンドを実行します。アンパサンド記号 (&) によって、直前のパイプラインが非同期的に実行されます。つまりシェルはパイプラインが終了するのを待ちません。&& という記号は、直前のパイプラインの終了ステータスが 0 の場合にだけ、後続のリストを実行するものです。反対に (\||\||) は、終了ステータスが 0 以外の場合にだけ、後続のリストを実行します。コマンドの区切りとして、セミコロンの代わりに任意の数の復帰改行を list に指定できます。
コマンド (command) は、単純コマンドまたは次のいずれかです。特に断わりのないかぎり、コマンドが返す値は、そのコマンド中で最後に実行された単純コマンドの値です。
for name [ in word .\|.\|. ] do list done
for コマンドが実行されるたびに、name は in word リストから次に得られる word に設定されます。If in word .\|.\|. を省略すると、for コマンドは、設定された各定位値パラメータに対して、do list を 1 回実行します (後述の「パラメータ置換」を参照)。リストの word がなくなると、実行は終了します。
case word in [ pattern [ | pattern ] ) list ;\|; ] .\|.\|. esac
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 list do list done
while コマンドは、while list を繰り返し実行し、list 中の最後のコマンドの終了ステータスが 0 の場合、do list を実行します。それ以外の場合、ループは終了します。do list 中のコマンドを実行しない場合、while コマンドは 0 の終了ステータスを返します。ループ終了条件の判定を逆にするには、while の代わりに until を使用します。
(list)
サブシェル内の list の実行
{ list;}
現在の (つまり、親) シェル内での list の実行。記号 { の後にはスペースが必要です。
name (\|) { list;}
name が参照する関数を定義します。{ と } の間のコマンド群 (list) が関数の本体となります (後述の「関数」参照)。記号 { の後にはスペースが必要です。関数の実行については「実行」の節で後述します。関数の本体が、前述の「コマンド」の節で定義したようなコマンドの場合、{ および } は必要ではありません。
下記のワードは、コマンドの最初に現れたとき、およびクォートされずに記述されたときに認識されます。
if then else elif fi case esac for while until do done { }
# でワードを始めると、そのワードおよび以降の 復帰改行までの文字がすべて無視されます。
シェルは、2 つの逆引用符 (``) で囲まれた文字列からコマンドを読み取ります。これらのコマンドからの標準出力は、ワードの一部または全体として使用できます。標準出力上で最後につく復帰改行は削除されます。
文字列は、読み取られる前にはいっさい解釈されません。ただし例外として、文字のエスケープに使用されるバックスラッシュ (\e) の削除だけは行われます。バックスラッシュは、逆引用符 (`) または別のバックスラッシュ (\e) をエスケープするためにも使用され、コマンド文字列の読み取り前に削除されます。逆引用符をエスケープすることにより、コマンド置換のネストが可能になります。コマンド置換が、一対の二重引用符に囲まれている場合 (" .\|.\|.\|` .\|.\|.\|` .\|.\|.\| ")、二重引用符 (\e") をエスケープするために使用されたバックスラッシュが削除されます。その他の場合は、変更がないままです。
復帰改行文字のエスケープにバックスラッシュを用いた場合は (\enewline)、バックスラッシュと復帰改行の両方が削除されます (後述の「クォート」の節の後半を参照)。さらに、ドル記号 (\e$) をエスケープしているバックスラッシュも削除されます。コマンド文字列に対するパラメータの置換は 読み取り前には行われないので、バックスラッシュでドル記号をエスケープしようとしても 無意味です。\e、`、"、復帰改行 (newline)、および $ 以外の文字の前に付くバックスラッシュは、コマンド文字列の読み取り時にもそのまま残ります。
文字 $ は、置換可能なパラメータ (parameter) を示します。パラメータには、定位置パラメータとキーワードパラメータの 2 種類があります。パラメータが数字の場合、これは定位置パラメータです。定位置パラメータには、set によって値を割り当てることができます。キーワードパラメータ (変数とも呼ばれる) には、次の記述により値を代入することもできます。
name=value [ name=value ] .\|.\|.
value に対しては、パターンマッチングは行われません。同じ name を持つ関数と変数が存在することはできません。
${parameter}
パラメータの値 ( もしあれば ) は置換されます。中括弧が必要となるのは、パラメータの後に、その名前の一部として解釈すべきでない文字、数字、または下線を指定するときだけです。parameter が * または @ の場合、$1 で始まる定位値パラメータはすべて (スペースで区切られて) 置換されます。パラメータ $0 は、シェルが呼び出されたときに、引数 0 から設定されます。
${parameter:-word}
デフォルト値の使用。parameter が未設定または NULL の場合は、word の展開結果に置換されます。それ以外の場合は、parameter の値に置換されます。
${parameter:=word}
デフォルト値の割り当て。parameter が未設定または NULL の場合は、word の展開結果が parameter に割り当てられます。どのような場合でも、parameter の最終的な値に置換されます。この割り当て方法は変数だけに使用可能で、定位置パラメータや特殊パラメータには使用できません。
${parameter:?word}
parameter が NULL 以外の値に設定されている場合、その値に置き換えられます。その他の場合、word を出力しシェルを終了します。word を省略すると、メッセージ "parameter null or not set" が出力されます。
${parameter:+word}
parameter が NULL 以外の値に設定されている場合、word に置き換えられます。その他の場合は置換を行いません。
前述にあるように、word は、代入用文字列として使用する場合にだけ評価されます。たとえば次の例では、pwd が実行されるのは、d が設定されていないかあるいは NULL に設定されている場合だけです。
echo ${d:-`pwd`}
前述の式からコロン (:) を省略すると、シェルは parameter が設定されているかどうかだけをチェックします。
次のパラメータは、シェルが自動的に設定します。
#
定位置パラメータ数 (10 進数 )
-
呼び出し時にまたは set コマンドによってシェルに与えられたフラグ
?
最後に同期実行されたコマンドが返した 10 進数
$
このシェルのプロセス番号
!
最後に呼び出されたバックグラウンドコマンドのプロセス番号
次のパラメータはシェルによって使用されます。このセクションのパラメータは、環境変数とも呼ばれます。
HOME
cd コマンドのデフォルト引数 (ホームディレクトリ)。login(1) によって、パスワードファイルから ユーザーのログインディレクトリに設定されます (passwd(4) を参照)。
PATH
コマンド用検索パス (後述の「実行」を参照)。
CDPATH
cd コマンドの検索パスを指定します。
このパラメータにメールファイルの名前がセットされていて、かつ MAILPATH パラメータが設定されていない場合、シェルは指定されたファイルにメールが到着するとユーザーに通知します。
MAILCHECK
このパラメータは、MAILPATH または MAIL パラメータで指定されたファイルへメールが到着したか否かを、シェルが何秒ごとにチェックするかを指定します。デフォルト値は 600 秒 (10 分) です。0 が設定された場合、シェルは各プロンプトを出す前にチェックを行います。
MAILPATH
コロン (:) で区切ったファイル名のリスト。このパラメータが設定されると、指定されたいずれかのファイルにメールが到着するたびに、シェルはユーザーに通知します。各ファイル名の後には、% および更新時刻の変更時に出力されるメッセージを指定できます。デフォルトのメッセージは you have mail です。
PS1
1 次プロンプト文字列。デフォルトは " $ \|" です。
PS2
2 次プロンプト文字列。デフォルトは " > \|" です。
IFS
内部フィールドセパレータ。通常はスペース、タブ、および復帰改行です (「ブランクの解釈」を参照)。
SHACCT
このパラメータにユーザーが書き込み可能なファイル名が設定された場合、シェルは、実行された各シェルプロシージャーごとのアカウンティングレコードをこのファイルに書き込みます。
SHELL
シェルは、呼び出されると、このパラメータが示す名前が環境中に存在するかを確かめます (「環境」の節を参照)。
sh の実行に影響を与える次の環境変数についての詳細は、environ(5) を参照してください。LC_CTYPE および LC_MESSAGES。
シェルは、PATH、PS1、PS2、MAILCHECK、および IFS にデフォルト値を割り当てます。HOME および MAIL のデフォルト値は login(1) で設定します。
パラメータとコマンドの置換後、置換の結果内でフィールドセパレータ文字 (IFS で発見されるもの) を検索し、その文字が現れた位置で分割します。分割された各々が引数となります。明示的な NULL 引数 ("" または '') は保持されます。暗示的な NULL 引数 (値を持たないパラメータにより生ずるもの) は削除されます。
シェルが解釈する特殊表記法によって、入出力をリダイレクションできます。以下は、単純コマンド内の任意の位置およびコマンドの前後に指定することができ、起動されたコマンドには引数として引き渡されません。注: word または digit を使用する前にコマンドとパラメータの置換が発生します。
<word
word というファイルを標準入力 ( ファイル記述子 0) として使用します。
>word
word というファイルを標準出力 ( ファイル記述子 1) として使用します。ファイルが存在しない場合は作成します。ファイルが存在していれば、ファイルの長さを 0 にします。
>>word
word というファイルを標準出力として使用します。ファイルが存在する場合、(EOF までシークしたあと) そのファイルに出力を追加します。そうでない場合は、ファイルを作成します。
<\|>word
word というファイルを標準入力として読み書き用に開きます。
<<[-]word
word に対するパラメータおよびコマンド置換が行われた後、その結果得られた word と文字どおり一致する最初の行が現れるまで、または EOF に達するまでシェルへの入力が読み取られます。ただし << に - が付加されて指定された場合は、以下のようになります。
1. まず、シェルへの入力の読み取り前に (ただしパラメータとコマンドの置換後) 、先行するタブを word から取り除きます。
2. 読み取ったシェルへの入力の各行を word と比較する前に、その行から先行するタブを取り除きます。そして、
3. その結果得られた word と文字どおり一致する最初の行が現れるまで、または EOF に達するまでシェルへの入力が読み取られます。
1. まずパラメータとコマンドの置換を実施します。
2. エスケープされた復帰改行 ( \enewline ) を削除します。
3. 文字 \e、$、および ` に対しては、\e を使ってクォートしなければなりません。
<&digit
ファイル記述子 digit に対応するファイルを標準入力として使用します。同様に、標準出力の使用には >&digit を指定します。
<&-
標準入力をクローズします。同様に、標準出力については >&- を使用します。
前述のいずれかの前に数字が付く場合、その値が (デフォルトの 0 または 1 の代わりに) 該当ファイルに対応したファイル記述子となります。例:
... 2>&1
この例では、現在ファイル記述子 1 に関連しているファイルに、ファイル記述子 2 を関連付けます。
リダイレクションを指定する場合、記述する順序が重要になります。シェルは、リダイレクション記述を左から右へ評価します。例:
... 1>xxx 2>&1
前述の例では、まず xxx というファイルにファイル記述子 1 を関連付けます。次に、ファイル記述子 1 に関連するファイル ( つまり xxx) に、ファイル記述子 2 を関連付けます。リダイレクションの向きが逆であれば、まずファイル記述子 2 を端末に関連付け (ファイルを記述子 1 が既に端末に関連付けられているとみなし)、次にファイル記述子 1 をファイル xxx に関連付けます。
最初のページの「コマンド」の節で述べた用語を使って説明すると、次のようになります。コマンドが複数の単純コマンドで構成される場合、リダイレクションは、個々の単純コマンドに対して行う前に、コマンド全体に対して評価されます。すなわち、シェルはまずリスト全体に対してリダイレクションを評価し、次にリスト内の各パイプラインに対して評価し、次にパイプライン内の各コマンドに対して評価し、最後にコマンド内の各単純コマンドに対して評価します。
コマンドの後に & を指定すると、コマンドにおけるデフォルトの標準入力は /dev/null という空ファイルになります。その他の場合、コマンドを実行するための環境には、起動側シェルのファイル記述子 ( 入出力指定で変更可能 ) が含まれます。
コマンド実行に先立ち、各コマンドワードは、*、?、および [ を含んでいないかチェックされます。これらの文字のいずれかがあると、そのワードはパターンとみなされます。このワードは、パターンと一致する、辞書編集方式の順にソートされたファイル名に置換されます。パターンと一致するファイル名が見つからない場合、ワードは変更されません。ファイル名の先頭のピリオド (.) または スラッシュ (/) 直後のピリオドは、明示的に一致しなければなりません (後者の場合はスラッシュ自体をも含む)。
*
NULL 文字列を含め、任意の文字列と一致します。
?
任意の単一文字と一致します。
[.\|.\|.]
括弧内のいずれか 1 文字を表します。2 つの 文字を - で区切ると、その間にある任意の文字 (その 2 つの文字も含む) に一致します。先頭の [ の次の文字が ! である場合、[ ] で囲まれていない任意の文字と一致します。
クォートされているすべての文字 ( 下記「クォート」を参照 ) は、ファイル名において明示的に一致しなければなりませんので、ご注意ください。
次の文字はシェルに対しては特別な意味を持ち、クォートしない ( 後述の説明を参照 ) 限り ワードの終わりを表します。
; & ( ) | ^ < > 復帰改行 スペース タブ
これらの文字をクォートする、つまり文字自身を表すには、文字の前にバックスラッシュ (\e) を付けるか、または一対の引用符 (\|'\|' または "") で囲みます。処理中、シェルは、特定の文字をクォートして、それらが特別の意味を持たないようにすることができます。単一の文字をクォートするのに用いるバックスラッシュは、コマンド実行前にワードから取り除かれます。\e と復帰改行との組み合せは、コマンドとパラメータの置換前にワードから取り除かれます。
一対の単一引用符 (\|'\|') で囲まれたすべての文字 ( ただし単一引用符は除く ) は、シェルによってクォートされます。バックスラッシュは、一対の単一引用符で囲まれていれば特殊な意味を持ちません。単一引用符は、一対の二重引用符で囲めばクォートされますが (例 "\|'")、一対の単一引用符で囲んでもクォートされません。
一対の二重引用符 ("") の中では、パラメータとコマンドの置換が実施され、シェルは、その結果をクォートして、ブランクの解釈とファイル名の生成が行われないようにします。$* が一組の二重引用符で囲まれている場合、定位置パラメータは置換され、クォートされ、クォートされたスペースで分けられます ("$1 \|$2 \|. \|.\|."). しかし $@ が一組の二重引用符で囲まれている場合は、定位置パラメータは置換され、クォートされ、クォートされていないスペースで分けられます ("$1"\|"$2" \| .\|.\|. )。\e は \e、`、"、, (コンマ)、$ といった文字をクォートします。\e と復帰改行との組み合せは、コマンドとパラメータの置換前にワードから取り除かれます。バックスラッシュが \e、`、"、, (コンマ)、$、および 復帰改行以外の文字の前に付く場合は、バックスラッシュ自体がシェルによってクォートされます。
シェルは、対話的に使用すると、コマンドを読み取る前に PS1 の値によるプロンプトを発行します。復帰改行を入力したあとで、コマンドを完了するためにさらに入力が必要な場合は、2 次プロンプト (PS2 の値 ) が出力されます。
環境 (environment) は、通常の引数リストが実行されるプログラムに引き渡される場合と同様の方法で引き渡される、名前と値の対の集まりです (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 というシェルパラメータは、コマンドを含んでいる ディレクトリの検索パスを定義します。2 つのディレクトリ名は、コロン (:) で区切ります。デフォルトのパスは /usr/bin です。現在のディレクトリは NULL パス名によって指定されます。これは等号の直後、パスリスト内の任意の場所にある 2 つの区切り文字のコロンの間、またはパスリストの最後に記述できます。コマンド名に / が含まれている場合は、検索パスは使用されません。そうでない場合は、パスにおける各ディレクトリに実行可能ファイルがあるか検索します。ファイルが実行権を有するが、それが a.out ファイルでない場合、シェルコマンドの入ったファイルとみなされます。そのファイルを読み取るときは、サブシェルが生成されます。括弧で囲まれたコマンドもサブシェル内で実行されます。
シェルは、(あとで不必要な exec を行わなくてもいいように) 検索パス内のコマンドの位置を記憶します。コマンドが相対ディレクトリにあった場合、その位置を 現在のディレクトリの変更のたびに再決定しなければなりません。シェルは、PATH 変数が変更されるか hash -r コマンドが実行されるたびに、記憶していたすべての位置を忘れてしまいます ( 下記参照 ) 。
以下に示す特殊コマンドに対しては、入出力のリダイレクションが可能です。ファイル記述子 1 は、デフォルトの出力位置です。ジョブ制御が可能なときには、さらにいくつかの特殊コマンドがシェル環境に追加されます (「ジョブ制御」の節を参照)。
:
コマンドは何もせず、実行による影響は何もありません。終了ステータス 0 が返されます。
.\| filename
filename からコマンドを読み取り実行し、戻ります。PATH によって指定された検索パスを用いて、filename を含むディレクトリを探します。
bg [%jobid .\|.\|.]
ジョブ制御が可能なとき、bg コマンドはジョブの操作用に ユーザー環境に追加されます。停止状態のジョブをバックグラウンドで再び実行します。%jobid を省略すると、現在のジョブとみなされます。 (詳細については後述の「ジョブ制御」の節を参照)。
break [ n ]
for または while ループがあれば抜け出します。n を指定すると、n レベル分ブレークします。
cd [ argument ]
現在のディレクトリを argument に変更します。シェルパラメータ HOME は、argument のデフォルト値です。シェルパラメータ CDPATH は、argument を含むディレクトリの検索パスを定義します。2 つのディレクトリ名は、コロン (:) で区切ります。デフォルトのパスは空の文字列です (現在のディレクトリの指定)。なお 現在のディレクトリは 空のパス名で指定します。このパス名は、等号の直後か、パスリスト内の区切り文字のコロンの間に指定します。argument の先頭文字が / の場合、検索パスは使用しません。それ以外の場合は、パス中の各ディレクトリで argument を検索します。
chdir [ dir ]
chdir はシェルの作業用ディレクトリを dir が示すディレクトリに変更します。引数を指定しないと、そのユーザーのホームディレクトリに変更します。dir が現在のディレクトリからは見つからない相対パス名の場合、変数 CDPATH 環境内のディレクトリリストを検索します。dir が / で始まる値を持つシェル変数の名前である場合、その変数の値が示すディレクトリに変更します。
continue [ n ]
for または while ループの次の繰り返しを実行します。n を指定すると、n 番目のループから実行します。
echo [ arguments .\|.\|. ]
arguments の文字列が スペース文字に区切られて、シェルの標準出力に書かれます。使用法と説明については echo(1) を参照してください。
eval [ argument .\|.\|. ]
引数をシェルへの入力として読み取り、生成されるコマンドを実行します。
exec [ argument .\|.\|. ]
このシェルの代わりに、引数で指定されたコマンドを (新規プロセスは生成せずに) 実行します。入出力引数が指定可能で、その他の引数が指定されない場合は、これによってシェルの入出力が変更されます。
exit [ n ]
呼び出し元のシェルまたはシェルスクリプトを n で指定した終了ステータスで終了させます。n を省略すると、最後に実行されたコマンドの終了ステータスがシェルの終了ステータスになります (EOF によっても、シェルは終了します)。
export [ name .\|.\|. ]
指定された name 群に対し、後で実行されるコマンドの環境へ自動的にエクスポートされるようにマークを付けます。引数を省略すると、現在のシェル実行中にエクスポートのマークが付けられた 変数名を一覧表示します。親シェルからエクスポートされた変数名は、現在のシェル実行中に再びエクスポートされた場合にだけ 一覧表示されます。関数名はエクスポートされません。
fg [%jobid .\|.\|.]
ジョブ制御が可能なとき、fg はジョブの操作用に ユーザー環境に追加されます。このコマンドは、フォアグラウンド状態の停止ジョブを再び実行します。また、実行中のバックグラウンドジョブをフォアグラウンドへ移します。%jobid を省略すると、現在のジョブとみなされます。(詳細については後述の「ジョブ制御」の節を参照。)
getopts
コマンドシンタクス標準のサポート用に、シェルスクリプト内で使用されるコマンドです (Intro(1) を参照)。このコマンドは、定位置パラメータを構文解析し、オプションの正当性をチェックします。使用法と説明については、getoptcvt(1) を参照してください。
hash [ -r ] [ name .\|.\|. ]
シェルは、各 name ごとに、それが示すコマンドの検索パス内の位置を決定し、記憶します。-r オプションを指定すると、シェルは記憶したすべての位置を忘れます。引数をまったく指定しないと、記憶されたコマンドに関する情報が表示されます。この出力表示において、hits はシェルプロセスによってコマンドが呼び出された回数を表します。cost は、検索パスのコマンドを見つけるのに必要な作業です。コマンドが検索パスの「相対」ディレクトリにある場合、そのディレクトリの変更後にそのコマンドが格納された位置が再計算されます。これが行われるコマンドに対しては、hits 情報の隣にアスタリスク (*) が示されます。Cost の値は、再計算が行われるたびに増加されます。
jobs [-p|-l] [%jobid ...]
jobs -x command [arguments]
停止中またはバックグラウンドで実行中の すべてのジョブを報告します。%jobid を省略すると、停止中またはバックグラウンドで稼動中のすべてのジョブが報告されます。(詳細については後述の「ジョブ制御」の節を参照。)
kill [ -sig ] %job .\|.\|.
kill -l
TERM (終了) シグナルまたは指定されたシグナルのいずれかを、指定されたジョブまたはプロセスに送信します。シグナルは、番号または名前 (signal.h(3HEAD) に示されるもので、ただし「SIG」という接頭辞を取り除いたもの (CHLD と名付けられる SIGCHD 以外)) で指定します。送信するシグナルが TERM (終了) または HUP (ハングアップ) の場合、停止中のジョブまたはプロセスには CONT (継続) シグナルを送信します。job という引数は、活動中のジョブではないプロセスのプロセス ID を指定することもできます。後述の「ジョブ制御」の節を参照してください。第 2 の形式の kill -l は、シグナル番号とシグナル名をリスト表示します。(kill(1) 参照)。
login [ argument .\|.\|. ]
`exec login argument.\|.\|.\|' と同機能です。使用法と説明については、login(1) を参照してください。
newgrp [ argument ]
exec newgrp argument と同機能です。使用法と説明については、newgrp(1) を参照してください。
pwd
現在の作業用ディレクトリを表示します。使用法と説明については、pwd(1) を参照してください。
read name .\|.\|.
標準入力から 1 行を読み取り、内部フィールドセパレータの IFS (通常はスペースまたはタブ) を用いてワード境界を区切り、最初のワードを最初の name に割り当て、2 番目のワードを 2 番目の name に割り当て、続くワードも順次割り当てます。残ったワードは最後の name に割り当てます。\e に続いて復帰改行を入力すれば、行を継続できます。復帰改行以外の文字の前にバックスラッシュを付加すれば、その文字をクォートできます。このバックスラッシュは、ワードが name に割り当てられる前に削除され、バックスラッシュの後に位置する文字は解釈されません。EOF に到達した場合を除き、リターンコードは 0 となります。
readonly [ name .\|.\|. ]
指定された各 name に「読み取り専用」のマークを付け、これらの名前が後続の割り当てでは変更できないようにします。引数を省略すると、読み取り専用と指定された名前がすべて一覧表示されます。
return [ n ]
関数を、n が示すリターンステータスで終了させます。n を省略すると、リターンステータスは最後に実行された コマンドのリターンステータスになります。
set [ -aefhkntuvx [ argument .\|.\|. ] ]
-a
エクスポート用に修正または作成された変数にマークを付けます。
-e
コマンドが 0 以外の終了ステータスで終了した場合、直ちに終了します。
-f
ファイル名を生成しないようにします。
-h
関数の定義時に、関数コマンドを検索しその位置を記憶します ( 通常、関数コマンドは関数実行時に検索されます ) 。
-k
コマンド名の前にあるキーワード引数だけでなく、すべてのキーワード引数がコマンド用の環境に置かれます。
-n
コマンドを読み取るが、実行しません。
-t
1 つのコマンドを読み取り、実行し、終了します。
-u
未設定の変数を置換時にエラーとして扱います。
-v
シェルへの入力行の読み取り時に、その内容を表示出力します。
-x
コマンドおよび引数の実行時に、その内容を表示出力します。
-
どのフラグも変更しません。$1 に - を設定する際に便利です。
shift [ n ]
$n+1 .\|.\|. から始まる一連の定位置パラメータを、次の名前に変更します。$1 .\|.\|. 。 n を省略すると、1 と見なされます。
stop pid .\|.\|.
pid (プロセス ID 番号) の実行を停止します (ps(1) を参照)。
suspend
現在のシェルがログインシェルでない場合、その実行を中断します。
test
条件式を評価します。使用法と説明については、test(1) を参照してください。
times
シェルから実行されたプロセスの、 ユーザー時間およびシステム時間の累計値を表示します。
trap [ argument n [ n2 .\|.\|. ]]
argument が示すコマンドを、シェルが数値または記号シグナル (n) を受信した時に読み取り実行します。(注: argument は、トラップ設定時に一度、トラップ取り出し時に一度検索されます。)トラップコマンドは、シグナル番号または対応するシンボリック名の順序で実行されます。現在のシェルへの入力時に無視されたシグナルにトラップを 設定しようとしても無効となります。シグナル 11 ( メモリフォールト ) にトラップを指定しようとすると、エラーになります。argument を省略すると、すべてのトラップ n は元の値に再設定されます。argument が NULL 文字列の場合、シェルおよびシェルが呼び出したコマンドは、このシグナルを無視します。n が 0 の場合、argument が示すコマンドはシェル終了時に実行されます。引数なしの trap コマンドは、コマンドの一覧を各々が対応しているシグナル番号とともに表示します。
type [ name .\|.\|. ]
各 name ごとに、コマンド名として使用される場合に どのように解釈されるかを指示します。
ulimit [ [-HS] [-a | -cdfnstv] ]
ulimit [ [-HS] [-c | -d | -f | -n | -s | -t | - v] ] limit
ulimit は、リソースの強い制限値または弱い制限値を 表示または設定します。これらの制限値については getrlimit(2) の説明を参照してください。 limit 引数を省略すると、ulimit は指定されている制限値を表示します。制限値は一度にいくつでも表示できます。-a オプションは制限値すべてを表示します。 limit 引数を指定すると、ulimit は指定されたフラグに対応する制限値をその引数の値に設定します。文字列 unlimited は、現在の制限値 (ある場合) の削除を要求します。ユーザーはだれでも、強い制限値以下の値に弱い制限値を設定できます。ユーザーはだれでも、強い制限値を下げることができます。適切な特権を持ったユーザーだけが、強い制限値を上げたり、削除したりできます。getrlimit(2) を参照してください。 -H オプションは強い制限値を表し、-S オプションは弱い制限値を表します。どちらのオプションも指定しない場合、ulimit は両方の制限値を設定し、弱い制限値を表示します。 次のオプションは、制限値を表示または設定するリソースを指定します。オプションを一切指定しないと、ファイルサイズ限界値を表示または設定します。
-c
最大 core ファイルサイズ (512 バイトブロック単位)
-d
データセグメントまたはヒープの最大サイズ (K バイト単位)
-f
最大ファイルサイズ (512 バイトブロック単位)
-n
最大ファイル記述子プラス 1
-s
スタックセグメントの最大サイズ (K バイト単位)
-t
最大 CPU 時間 (秒単位)
-v
仮想メモリーの最大サイズ (K バイト単位)
ulimit -c 0
umask [ nnn ]
ユーザーファイル作成マスクを nnn が示す値に設定します (umask(1) を参照)。nnn を省略すると、マスクの現在の値を出力します。
unset [ name .\|.\|. ]
name ごとに、対応する変数または関数値を削除します。変数 PATH、PS1、PS2、MAILCHECK、および IFS は設定解除できません。
wait [ n ]
当該ユーザーのバックグラウンドプロセスのうち ID が n のプロセスを待ち、その終了ステータスを報告します。n が省略された場合、当該ユーザーの現在活動中のすべてのバックグラウンドプロセスを待ち、リターンコードは 0 になります。
exec(2) を介してシェルが呼び出される場合で、引数 0 の先頭文字が - のとき、コマンドは、まず /etc/profile から読み込まれ、次に $HOME/.profile から読み込まれます (これらのファイルがある場合)。その後、コマンドは後述のように読み込まれます。シェルが /usr/bin/sh として呼び出される場合にも、このようになります。以下に述べるフラグは、呼び出し時にのみ、シェルによって解釈されます。なお -c または -s フラグが指定されないかぎり、先頭引数はコマンドを含むファイルの名前であるとみなされ、残りの引数は定位置パラメータとして そのコマンドファイルに引き渡されます。
-c\| string
このフラグが指定されると、string からコマンドを読み取ります。-
-i
このフラグが指定された場合あるいはシェル入出力が端末に接続されている場合、このシェルは対話型となります。-この場合、kill 0 が対話型シェルを終了しないように TERM を無視し、wait が割り込み可能になるように INTERRUPT を捕え、無視します。いずれの場合も、シェルは QUIT を無視します。
-p
-p フラグが指定されると、シェルは実効ユーザーおよびグループ ID に、実ユーザーおよびグループ ID を設定しません。
-r
-r フラグを指定すると、シェルは制限付きシェルになります (rsh(1M) を参照)。
-s
このフラグが指定された場合または引数が残っていない場合、標準入力からコマンドを読み取ります。-引数が残っていれば、それらは定位置パラメータを指定します。前述の特殊コマンドの出力を除くシェル出力は、ファイル記述子 2 に書き込まれます。
他のフラグと引数については、前述の set コマンドの箇所で説明されています。
シェルを jsh として呼び出すと、sh の説明で述べたすべての機能に加えて、ジョブ制御が可能になります。通常、ジョブ制御は対話型シェルに対してだけ可能です。非対話型シェルは、ジョブ制御の機能が追加されても、その恩恵を受けないのが通常です。
ジョブ制御が可能な場合、ユーザーが端末から入力したコマンドまたはパイプラインは、すべてジョブ ( job) と呼ばれます。どのジョブも、必ず次のいずれかの状態にあります。 フォアグラウンド、バックグラウンド、または停止です。これらの用語の定義を次に示します。
1. フォアグラウンド状態にある ジョブは、制御している端末への読み取り および書き込み権を持っています。
2. バックグラウンド状態にあるジョブは、制御している端末への読み取り権を拒否されていますが、条件付き書き込み権は持っています (stty(1) を参照)。
3. 停止ジョブは保留状態に置かれた ジョブであり、通常は SIGTSTP シグナルにより、この状態になります (signal.h(3HEAD) を参照)。
シェルが起動するすべてのジョブには、ジョブ番号 (job number) と呼ばれる正の整数が割り当てられます。シェルはこの番号を把握し、特定のジョブを示す識別子として使用します。また、シェルは現在 (current) および直前 (previous) のジョブも把握しています。現在のジョブとは、最後に起動または再起動されたジョブです。前回のジョブとは、その直前のジョブです。
ジョブ識別子の正しい構文は次のような形式です。
%jobid
このうち jobid は、次のいずれかの形式で指定できます。
% または +
現在のジョブ
-
前回のジョブ
?<string>
コマンド行が string を含んでいるジョブ
n
ジョブ番号が n のジョブ
pref
コマンド名の先頭が pref のコマンド。たとえば ls -l name がバックグラウンドで実行中だった場合、%ls と指定すればこのコマンドを示すことができます。pref は、クォートしない限り、ブランクを含めることができません。
ジョブ制御が可能なとき、ジョブの操作用に 次のコマンドがユーザー環境に追加されます。
bg [%jobid .\|.\|.]
停止状態のジョブをバックグラウンドで再び実行します。%jobid を省略すると、現在のジョブとみなされます。
fg [%jobid .\|.\|.]
停止状態のジョブをフォアグラウンドで再び実行します。また、実行中のバックグラウンドジョブをフォアグラウンドへ移します。%jobid を省略すると、現在のジョブとみなされます。
jobs [-p|-l] [%jobid .\|.\|.]
jobs -x command [arguments]
停止中またはバックグラウンドで実行中の すべてのジョブを報告します。%jobid を省略すると、停止中またはバックグラウンドで稼動中のすべてのジョブが報告されます。次のオプションは、jobs の出力を変更または拡張するために使用します。
-l
ジョブのプロセスグループ ID および作業ディレクトリを報告します。
-p
ジョブのプロセスグループ ID のみを報告します。
-x
コマンドまたは引数中に見つかった jobid を、対応するプロセスグループ ID に置き換え、コマンドに引数を渡して実行します。
kill [ -signal ] %jobid
kill コマンドの組み込みバージョン。jobid で示すプロセスに対して kill コマンドの機能を提供します。
stop %jobid .\|.\|.
バックグラウンドジョブの実行を停止します。
suspend
現在のシェルがログインシェルでない場合、その実行を中断します。
wait [%jobid .\|.\|.]
wait コマンドの組み込みバージョンで、ジョブ識別子の指定を受け入れます。%jobid が省略された場合、wait は、前述の「特殊コマンド」で説明したように動作します。
ファイルが 2G バイト (2^31 バイト) 以上ある場合の sh と jsh の動作については、largefile(5) を参照してください。
構文エラーなどのエラーを検出すると、シェルは 0 以外の終了ステータスを返します。シェルを非対話型で使用している場合、シェルファイルの実行は中止されます。そうでない場合は、シェルは最後に実行されたコマンドの 終了ステータスを返します ( 前述の exit コマンドの説明を参照 ) 。
シェルが jsh として呼び出された場合、停止ジョブがあるのにシェルを終了させようとすると、シェルは次のような警告を出します。
There are stopped jobs.
これが唯一のメッセージです。もう一度終了が試みられ、停止ジョブがまだ存在している場合、これらのジョブにカーネルから SIGHUP シグナルが送られ、シェルは終了します。
$HOME/.profile
属性についての詳細は、attributes(5) を参照してください。
属性タイプ | 属性値 |
使用条件 | system/core-os |
CSI | 有効 |
属性タイプ | 属性値 |
使用条件 | system/core-os |
CSI | 有効 |
Intro(1), bc(1), echo(1), getoptcvt(1), kill(1), ksh88(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 is empty!
このような場合、入力または出力をリダイレクトするには、次の例のように exec を使用します。
# Save standard input (file descriptor 0) as file # descriptor 3, and redirect standard input from the file /etc/passwd: exec 3<&0 # save standard input as fd 3 exec </etc/passwd # redirect input from file lastline= while read line do lastline=$line done exec 0<&3 # restore standard input exec 3<&- # close file descriptor 3 echo "$lastline" # lastline
cannot fork, too many processes というエラーメッセージを受け取った場合には、wait(1) コマンドを用いてユーザーのバックグラウンドプロセスをクリーンアップしてください。これを行なっても問題が解決しない場合には、システムのプロセステーブルが一杯になっていること、または実行中のフォアグラウンドプロセスの数が多すぎることが考えられます。ユーザーログインに結合するプロセス ID の数、およびシステムが把握できる数には 限度があります。
パイプラインの最後のプロセスだけが、待つ対象になり得ます。
あるコマンドを実行し、そのあとで同一名のコマンドが、検索パスにおいて元のコマンドがあるディレクトリの前に位置するディレクトリにインストールされた場合、シェルは元のコマンドの方を実行し続けます。新しい方のコマンドを実行させたければ、hash コマンドを使用してください。
Bourne シェルにはプロセスの実効ユーザー ID に対して制限があります。このユーザー ID が 100 よりも小さい (さらにプロセスの実ユーザー ID と同等ではない) 場合には、ユーザー ID はプロセスの実ユーザー ID にリセットされます。
同じプロセスグループで フォアグラウンドジョブと バックグラウンドジョブの両方を シェルが実行しているため、ジョブは同じシグナルを受け取り、予期しない結果を招くことがあります。したがって、特に対話型のシェルを動作している場合は、他のジョブ制御のシェルを使用することを おすすめします。
存在しないコマンドのインタプリタを実行しようとするシェルスクリプトを、シェルが処理した場合、シェルはシェルスクリプトが存在しないという間違った診断メッセージを 返します。