SH(1) FreeBSD 一般コマンドマニュアル SH(1)
名称
sh − コマンドインタプリタ (シェル) |
書式
sh [−/+abCEefIimnPpsTuVvx] [−/+o longname] [−c string] [arg ...] |
解説 |
sh ユーティリティはシステムの標準コマンドインタプリタです。現在 sh は IEEE Std 1003.2 (‘‘POSIX.2’’) のシェル規約に対応する途上にあります。本 バージョンのシェルは、見方によっては Korn shell と同様に見える機能を多数 持っていますが、 pdksh のような Korn shell クローンではありません。この シェルには、POSIX で規定された仕様といくつかの Berkeley 拡張のみが取り入 れられています。本マニュアルは、shell のチュートリアルではありませんし、 仕様を完全に記述するものでもありません。 |
概要 |
シェルは、ファイルまたは端末から 1 行ずつ読み込み、それを解釈し、コマンド を実行します。シェルはユーザがシステムにログインしたときに起動されるプロ グラムです (ただし、ユーザは chsh(1) コマンドによって他のシェルを選択する こともできます)。シェルは、制御構文を持つ言語であり、データ記憶をはじめと して多様な機能を提供するマクロ機能、ヒストリ、行編集機能も内蔵していま す。このシェルは対話的に使うときに便利な機能を多くとり入れており、対話的 に用いるときも非対話的に (シェルスクリプトとして) 用いるときも、共通のイ ンタプリタ言語を用いることができる利点があります。すなわち、コマンド名を シェルに直接タイプすることも、コマンド名をファイルに書いておいてそのファ イルをシェルに直接実行させることもできます。 |
起動 |
引数が与えられず、かつシェルの標準入力が端末の場合 (または −i フラグが指 定された場合)、シェルは対話的に動作します。対話的シェルは、通常、コマンド 入力時にプロンプトを表示し、文法的なエラーとコマンドエラーを異なった方法 で処理します (後述します)。起動時に、シェルは 0 番目の引数を検査します。 もしそれがマイナス記号 (-) で始まっているなら、シェルはログインシェルとし て動作します。ユーザがシステムにログインした場合は自動的にこの状況になり ます。ログインシェルは、まず (以下の各ファイルが存在する場合)、 /etc/profile と次に .profile ファイルからコマンドを読み込みます。シェル起 動時に、もしくはログインシェルで .profile を実行中に環境変数 ENV が設定さ れているなら、シェルは、その次に環境変数 ENV で示されたファイルからコマン ドを読み込みます。つまり、ユーザはログイン時にのみ実行したいコマンドを .profile に書き、シェルが起動されるたびに実行したいコマンドを環境変数 ENV で示すファイルに書くことになります。環境変数 ENV を設定するには、ホーム ディレクトリ下のファイル .profile に以下のように記述します。ここで .shinit のかわりに好きな名前を指定することができます。 |
ENV=$HOME/.shinit; 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 −e errexit −f noglob −I ignoreeof −i interactive −m monitor −n noexec −P physical −p privileged −s stdin −T trapsasync sh -T -c "trap ’exit 1’ 2 ; some-blocking-program" |
−u nounset
値が設定されていない変数を展開しようとした場合、標準エラー出力に エラーメッセージを出力し、さらに非対話的シェルならば、ただちに シェルを終了します。 −V vi −v verbose −x xtrace −c オプションは、シェルの入力として解釈させる文字列引数を渡すために使用可 能です。このオプションは引数として文字列を一つだけ受け取ることに注意して 下さい。ですから、複数の単語からなる文字列は引用符で囲う必要があります。 −/+o オプションは、オプションの長い名前のみを引数としてとり、オプションの 有効化と無効化を行います。例えば、次の 2 つの sh 起動方法では組み込みの emacs(1) コマンドラインエディタを有効化します: set -E −o オプションが引数なしで使用された場合、現在のオプション設定を人が読める 形式で表示します。 +o が引数なしで使用された場合は、現在のオプション設定 をシェルへ再入力するのに適した形式で出力します。 |
構文構造 |
シェルは、ファイルを行単位で読み込み、空白文字 (ブランクおよびタブ) や シェルにとって特別な意味を持つ特定の文字列 ( ‘‘演算子’’ と呼ばれるもので す) を区切りとして、複数の単語に分割します。演算子には、制御演算子とリダ イレクト演算子の 2 種類があります (これらの意味については後述します)。以 下に、それらの一覧を示します。 |
制御演算子:
& && ( ) \n |
;; ; | || |
リダイレクト演算子:
< > << >> <> |
<& >& <<- >| |
引用 (クォート) |
引用は、特殊な意味を持つ文字や単語 (演算子、空白、キーワードなど) の意味 を打ち消すために用います。引用には、シングルクォート文字のペアを使う方 法、ダブルクォート文字のペアを使う方法、バックスラッシュ文字を使う方法の 3 種類があります。 |
シングルクォート文字
シングルクォートのペアで囲まれた文字は、すべてその文字そのまま ( リテラル) として扱われます (ただしシングルクォートは別です。シン グルクォートで囲った文字列の中にシングルクォートを含めることはで きません)。 ダブルクォート文字 |
$ ‘ " \ \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. 次節で説明する方法で、リダイレクトを行います。 リダイレクト [n] redir-op file ここで、 ‘redir-op’ は前述したリダイレクト演算子のいずれかです。これらの 演算子をどのように利用するかの例をいくつか以下に挙げます。 [n]> file [n]>| file [n]>> file [n]< file [n]<> file [n1]<&n2 [n]<&- [n1]>&n2 [n]>&- 以下のリダイレクトは、しばしば ‘‘ヒア・ドキュメント (here-document)’’ と 呼ばれます。 [n]<< delimiter |
here-doc-text |
||
... |
delimiter シェルは、delimiter までの行を保存し、コマンドへの標準入力またはファイル 記述子 n にリダイレクトします。最初の行の delimiter が引用 (クォート) さ れていた場合、here-doc-text の内容をリテラルとして扱います。そうでない場 合、パラメータ展開、コマンド置換、数値演算 ( 単語展開の節で説明します) を 適用します。演算子が ( ‘‘<<’’ でなく) ‘‘<<-’’ の場合は、 here-doc-text の 各行の行頭のタブを取り除きます。 |
コマンド検索と実行 |
コマンドには、シェル関数、組み込みコマンド、通常プログラムの 3 種類があ り、コマンドを検索する際には、シェルは名前の検索をこの順序で行います。 3 種類のコマンドは異なる方法で実行されます。 シェル関数を実行するとき、$0 を除くすべての位置パラメータ ($1, $2,..) を シェル関数への引数として設定します。$0 は変更されません。シェル関数の環境 として指定された変数 (関数名の直前に ‘‘name=value’’ を置いて指定されたも の) は、その関数に局所的な変数となり、指定された初期値が設定されます。そ して、シェルは関数定義で与えられたコマンドを実行します。コマンドの実行が 完了すると、位置パラメータを元の値に戻します。これは全て現在のシェルの中 で処理されます。 シェルの組み込みコマンドは、新たなプロセスを作成せずにシェル内部で実行さ れます。 コマンドが関数でも組み込みコマンドでもない場合は、通常のプログラムとみな し (次節で説明するとおり) ファイルシステムの中でそのコマンドを検索しま す。通常のプログラムを実行する場合、シェルは引数と環境をプログラムに渡し て、そのプログラムを実行します。プログラムが通常の実行ファイル形式ではな い場合 (つまり、 ASCII 表現で "#!" となる "マジックナンバ" でファイルが始 まっておらず、 execve(2) が ENOEXEC を返す場合)、サブシェルの中でそのプロ グラムを解釈実行します。この場合、あたかも新たにシェルが起動されたかのよ うな効果を得るために、子シェルは自分自身を再初期化します。ただし、子プロ セスは、親シェル中のハッシュされたコマンド位置情報を憶えており、これは再 初期化されません。 本ドキュメントの古いバージョンや古いソースコードでは、ときおり、マジック ナンバのないシェルスクリプトのことを "シェル手続き" と呼んでいて、まぎら わしい場合がありますので注意して下さい。 |
パス検索 |
コマンドを検索するとき、シェルは、まず、その名前のシェル関数があるかどう かを調べます。次に、その名前の組み込みコマンドがあるかどうかを調べます。 組み込みコマンドでもない場合、以下のいずれかの処理が行われます: |
1. コマンド名にスラッシュが含まれていれば、検索は行わず、単にそのコマンドが実行されます。
2. 変数 PATH に含まれる各エントリに対して、順にそのコマンドを検索しま す。変数 PATH の値はコロンで区切られたエントリの列でなければなりませ ん。各エントリは、それぞれディレクトリ名一つに対応します。カレント ディレクトリは、空のディレクトリ名を指定することで暗黙的に、あるいは 1 個のピリオドを指定することで明示的に指示することができます。 コマンドの終了ステータス コマンドがシグナルにより終了 (terminate) させられた場合、終了ステータスは 128 にシグナル番号を加えたものになります。シグナル番号はヘッダファイル <sys/signal.h> に定義されています。 複合コマンド (Complex Commands) 単純コマンド パイプライン リストまたは合成リスト (compound-list) 合成コマンド (compound command) 関数定義 特に指定のない場合、コマンドの終了ステータスは最後に実行された単純コマン ドの終了ステータスとなります。 パイプライン パイプラインの形式は次のとおりです。 [!] command1 [| command2 ...] command1 の標準出力は command2 の標準入力に接続されます。コマンドの標準入 出力がパイプラインによって割り当てられるのは、各コマンドに属するリダイレ クト演算子で指定されたリダイレクトを処理する前のことだと考えて下さい。 パイプラインがバックグラウンド (後述) でなければ、シェルはすべてのコマン ドが終了するのを待ちます。 パイプラインの直前に予約語 ! が置かれなかった場合、終了ステータスはパイプ ラインの最後のコマンドの終了ステータスとなります。 ‘!’ が前置された場合、 終了ステータスはパイプラインの最後のコマンドの終了ステータスの論理否定を 取った値となります。すなわち、最後のコマンドが 0 を返した場合、パイプライ ンの終了ステータスは 1 に、最後のコマンドが 0 より大きな値を返した場合、 終了ステータスは 0 になります。 パイプラインによる標準入出力の接続はリダイレクトに先立って行われるため、 パイプラインの接続をリダイレクトによって修正することができます。たとえ ば、 $ command1 2>&1 | command2 ‘command1’ の標準出力と標準エラー出力の両方を ‘command2’ の標準入力に接続 します。 ‘‘;’’ または改行文字を終端として用いることにより、直前の AND-OR リスト ( 短絡リスト演算子で後述) を順次実行します。 ‘‘&’’ は、直前の AND-OR リスト を非同期に実行します。 注: 他のいくつかのシェルと異なり、 sh ではパイプラインの各プロセスは起動 した sh の子プロセスとなります。シェルの組み込みコマンドであるときは別で す。その場合は現在のシェルで実行されますが、環境に対する操作は影響を与え ません。 バックグラウンドコマンド (&) コマンドをバックグラウンドで実行させるための形式は以下のとおりです。 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 |
各 word は展開され、変数 variable に word を順に設定しながらリストを繰り 返し実行します。 do と done は ‘‘{’’ と ‘‘}’’ で置き換えることができま す。 break と continue コマンドの文法は以下のとおりです。 |
break [num] |
continue [num] |
break は内側から num 個の for ループまたは while ループを終了します。 continue は内側から num 個のループの次の繰り返しに制御を移します。これら のコマンドは組み込みコマンドとして実装されています。 case コマンドの文法は以下のとおりです。 |
case word in |
pattern) list ;; |
... |
esac |
pattern は、1 つあるいは複数のパターン (後述の シェルパターンを参照のこ と) を ‘‘|’’ で接続したものです。 |
複数のコマンドのグループ化 |
コマンドは、以下のいずれかの方法によりグループ化することができます。 (list) または、 { list; } 最初の形式では、コマンドはサブシェル上で実行されます。このため、組み込み コマンドは現在のシェルには影響を与えないことに注意してください。 2 つめの 形式では新たなシェルを fork しないので、やや効率が良くなります。このよう にして複数コマンドをグループ化することで、あたかも単一プログラムであるか のように、それらの出力をまとめてリダイレクトすることができます。 { 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] これは現在の実行スコープを終了し、1 つ前のネストした関数、読み込まれたス クリプト、シェルのインスタンスから、それぞれこの順で返ります。 return は 現在実行中の関数を終了させます。 return は組み込みコマンドとして実装され ています。 |
変数とパラメータ |
シェルはパラメータの集合を管理しています。名前を持つパラメータを変数と呼 びます。シェルは、起動時にすべての環境変数をシェル変数に取り込みます。新 たな変数は、次の形式によって設定できます。 name=value ユーザが設定する変数は、アルファベット、数字、アンダスコア (_) のみからな る名前を持つ必要があります。また、最初の文字が数字であってはいけません。 パラメータは、以下に示す数字または特殊記号により参照することもできます。 |
位置パラメータ |
位置パラメータは、0 より大の数字によって参照されるパラメータです。シェル は位置パラメータの初期値としてシェルスクリプト名に続く引数を設定します。 組み込みコマンド set により再設定や消去ができます。 |
特殊パラメータ |
特殊パラメータは、以下に挙げる特殊文字のいずれかにより参照されるパラメー タです。各パラメータの値の説明を各文字の後ろに示します。 |
* 位置パラメータ 1,2,... に展開されます。ダブルクォート文字列内部で展開される場合、展開結果は各位置パラメータの間を変数 IFS の先頭の文字 ( IFS が設定されていない場合は 〈空白文字〉 ) で区切った単一の文字列になります。
@ 位置パラメータ 1,2,... に展開されます。ダブルクォート引用の内部で 展開される場合、各位置パラメータは別々の引数となります。もし、位 置パラメータが設定されていない場合には、 @ の展開結果は 0 個の引 数となります (ダブルクォート引用の内部であっても)。すなわち、$1 が ‘‘abc’’ 、$2 が ‘‘def ghi’’ であった場合、 "$@" は次の 2 つの 引数に展開されます。 "abc" "def ghi" |
# 位置パラメータの数に展開されます。
? 最後に実行したパイプラインの終了ステータスに展開されます。 - (ハイフン) 現在のオプションフラグ (1 文字オプション名をつないだ文 字列) に展開されます。起動時に指定されたもの、組み込みコマンド set で指定したもの、シェルが暗黙に設定したもののすべてを含みま す。 $ 起動されたシェルのプロセス ID に展開されます。サブシェルも親シェ ルと同じ値を持ちます。 ! 現在のシェルが最後にバックグラウンドで実行したコマンドのプロセス ID に展開されます。パイプラインの場合、パイプラインの最後のコマン ドのプロセス ID になります。 0 (ゼロ) シェルの名前またはシェルスクリプト名に展開されます。 単語展開 単一の単語に対して適用されたチルダ展開、パラメータ展開、コマンド置換、数 式展開、クォート削除の結果は単一のフィールドになります。単一の単語が複数 のフィールドに分割される可能性があるのは、フィールド分割またはパス名展開 の場合だけです。この規則の唯一の例外は、ダブルクォート中のパラメータ @ の 展開です (前述)。 単語展開の順序は以下のとおりです。 1. チルダ展開、パラメータ展開、コマンド置換、数式展開 (これらはすべて同 時に行われます) 2. 変数 IFS の値が空でなければ、(1) の結果の各フィールドに対してフィー ルド分割が行われる 3. パス名展開 ( −f オプションが無効の場合) 4. クォート削除 文字 ‘‘$’’ はパラメータ展開、コマンド置換、数式評価を行うきっかけになりま す。 チルダ展開
(ユーザのホームディレクトリ名への置換) パラメータ展開 ${expression} ここで、expression は対応した ‘‘}’’ までのすべての文字です。対応する ‘‘}’’ を調べる際に、バックスラッシュ文字によりエスケープされたり、クォー ト文字に狭まれた ‘‘}’’ や、数式展開に埋め込まれている文字や、コマンド置換 や変数展開中にある文字は調べる対象になりません。 パラメータ展開の形式のうちもっとも単純なものは以下のとおりです。 ${parameter} そのパラメータに値が存在する場合、その値に置き換えられます。 パラメータ名やシンボルを中括弧 ({}) で囲んでも構いません。この中括弧は、 数字 2 文字以上からなる位置パラメータの場合や、パラメータ名の直後にパラ メータ名の一部であるとみなし得る文字が続く場合を除き、省略可能です。ダブ ルクォート引用中のパラメータ展開は以下のようになります。 |
1. パラメータ展開を行った結果の単語に対しては、パス名展開は適用されません。
2. パラメータが特殊パラメータ @ の場合を除き、フィールド分割は適用され ません。 さらに、以下の形式を用いることにより、パラメータ展開の結果に修正を加える ことができます。 ${parameter:-word} ${parameter:=word} ${parameter:?[word]} ${parameter:+word} 以上のパラメータ展開において、‘:’ を用いた場合はパラメータが設定されてい ないかまたは空の値であることが検査され、‘:’ を省略するとパラメータが設定 されていないことのみを検査します。 ${#parameter} 以下の 4 通りのパラメータ展開は部分文字列切り出し処理を行います。各場合に おいて、パターンは正規表現ではなく、パターンマッチ記法 ( シェルパターンの 項を参照) が用いられます。パラメータが * または @ の場合、展開の結果がど うなるかは規定しません (unspecified)。パラメータ展開全体をダブルクォート で囲んでもパターンは引用されません。中括弧のなかで引用することによりパ ターンを引用することができます。 ${parameter%word} ${parameter%%word} ${parameter#word} ${parameter##word} コマンド置換 $(command) またはバッククォートバージョン ‘command‘ とした場合に行われます。シェルは、コマンド command をサブシェルの環境で実 行し、command が標準出力に出力したものから最後の改行文字を削除した結果で 置換します。最後以外の改行は削除しません。ただし、フィールド分割の際に、 IFS の値や引用のされかたによっては、ここで残った改行文字が結局は空白に置 換されることもあります。 |
数式展開 |
数式展開とは、数式を評価し、その値に置換する仕組みです。数式展開の形式は 以下のとおりです。 $((expression)) 数式 expression は、その中のダブルクォート文字が特別扱いを受けないという 点を除いては、ダブルクォート文字で囲まれている文字列と同様に扱われます。 シェルは expression 中のすべてのトークンにパラメータ展開、コマンド置換、 クォート削除を適用します。 次にシェルはその結果を数式として扱い、その値に置換します。 |
空白文字による分割 (フィールド分割) |
パラメータ展開、コマンド置換、数式展開のあと、シェルは展開結果を調べて、 ダブルクォートの外にある部分に対してフィールド分割を適用します。その結 果、複数のフィールドになる場合もあります。 シェルは、変数 IFS に設定されている文字それぞれ区切り文字とみなし、パラ メータ展開の結果、およびコマンド置換の結果をフィールドに分割します。 |
パス名展開 (ファイル名生成) |
−f フラグが設定されていなければ、フィールド分割が行われたあと、ファイル名 生成が行われます。各単語は、スラッシュで区切られたパターンの列であるとみ なされます。パス名展開処理において、単語は、条件を満たすファイルすべての ファイル名の列で置換されます。この各ファイル名は、単語の各パターン部分 を、そのパターンに一致する文字列に置換することで生成されるものです。これ には 2 つの制限があります: まず、パターンはスラッシュを含む文字列には一致 しません。次に、パターンは、そのパターンがピリオドで始まらないかぎり、ピ リオドで始まる文字列に一致しません。次節では、パス名展開と case コマンド で用いられるパターンについて説明します。 |
シェルパターン |
パターンは、通常の文字とメタキャラクタからなります。通常の文字は、その文 字そのものに一致します。メタキャラクタは ‘‘!’’, ‘‘*’’, ‘‘?’’, ‘‘[’’ で す。これらの文字を引用すると、各々の特殊な意味を失います。コマンド置換や 変数置換において、ドル記号やバッククォート文字がダブルクォート文字の中に ない場合には、変数の値やコマンドの出力の中に、これらの特殊な文字が存在す るかどうかが調べられ、それらがあれば、メタキャラクタとして扱われます。 アスタリスク文字 (*) は、どのような文字列とも一致します。クエスチョンマー ク文字 (?) は、任意の文字 1 文字と一致します。左大括弧 ([) は文字クラスを 開始します。文字クラスの最後は右大括弧 ‘‘]’’ です。 ‘‘]’’ がない場合は、 ‘‘[’’ は文字そのものに一致し、文字クラスの開始とは見なされません。文字ク ラスは大括弧内に出現するすべての文字に一致します。マイナス記号を用いれ ば、文字の範囲を指定することができます。文字クラスの最初にエクスクラメー ションマーク (!) を置くことで、文字クラスの意味を反転させることができま す。 文字クラスに文字 ‘‘]’’ を含めるには、 ‘‘]’’ を文字クラスの最初 ( ‘‘!’’ を 置く場合はそのあと) に置きます。文字クラスに ‘‘-’’ を含めるときも同様で、 リストの最初もしくは最後に置きます。 |
組み込みコマンド |
本節では、別プロセスでは実行できない処理を行うために組み込まれているコマ ンドを列挙します。さらに、組み込みバージョンの test(1) が効率を上げるため に提供されています。 |
:
終了ステータス 0 (真) を返すヌルコマンドです。 . file alias [name ...] alias [name=string ...] bg [job ...] builtin cmd [arg ...] bind [ cd [ −P オプションが指定された場合、 .. は物理的に扱われ、シンボリック リンクは .. 部分が処理される前に解決されます。 −L オプションが指 定された場合は、 .. は論理的に扱われます。こちらがデフォルトに なっています。 chdir command [ −p オプションが指定された場合、コマンド検索は、 PATH のデフォルト 値を用いて行われます。これにより全ての標準ユーティリティを見つけ ることが保証されます。 echo [ −n −e \a \b \c \e \f \n \r \t \v \\ \0nnn string がクォートで括られていない場合、シェルからエスケー プするためには、バックスラッシュ自身をバックスラッシュで エスケープする必要があります。例えば次の通りです: $ echo -e "a\vb" −e と −n オプションのうち、どちらか片方のみを指定できます。 |
eval string ...
指定されたすべての引数を空白で結合し、その結果を解析し直してから コマンドとして実行します。 exec [command [arg ...]] exit [exitstatus] export [ export name=value 引数を指定しない場合、すべてのエクスポートされている名前と値が表 示されます。 −p オプションが指定された場合、エクスポートされてい る変数は、一行毎に ‘‘export name=value’’ という形式で表示されま す。これはシェルへ再入力するのに適しています。 |
fc [ −e editor] [first [last]]
fc −l [ fc −s [ −e editor −l (ell) −n −r −s first last [+]num -num string fc コマンドの実行にあたり、以下の環境変数の影響を受けます。 FCEDIT HISTSIZE fg [job] getopts optstring var hash [ 引数を指定した場合、 hash コマンドは指定した command をハッシュ テーブルから削除し ( command が関数ではない場合)、その後でそのコ マンドを検索します。 −v オプションを指定した場合、 hash は発見し たコマンドの位置を表示します。 −r オプションを指定した場合、 hash は関数以外のすべてのエントリをハッシュテーブルから削除します。 jobid [job] jobs [ −l オプションが指定された場合、各々のジョブの PID も表示されま す。 −s オプションが指定された場合、一行毎にジョブの PID のみが表 示されます。 pwd [−L | −P] −P オプションが指定された場合、シンボリックリンクは解決されます。 −L オプションが指定された場合、カレントディレクトリはシェルの表記 で表示されます (シンボリックリンクは解決されません)。こちらがデ フォルトです。 read [ −r オプションが指定された場合を除き、バックスラッシュは特別に扱わ れます。バックスラッシュ文字が改行文字の直前にある場合、バックス ラッシュ文字と改行文字は削除されます。その他の文字の直前にバック スラッシュがある場合、バックスラッシュは削除され、文字が IFS に含 まれていても、 IFS の文字でないかのように扱われます。 −t オプションが指定され、かつ入力がなされる前に timeout が経過す ると、 read コマンドは値を割当てずに戻ります。 timeout 値の後には オプションで ‘‘s’’, ‘‘m’’, ‘‘h’’ のいずれかの一文字を付けることが 出来、それぞれ秒・分・時間を陽に指定します。どれも指定しない場合 には ‘‘s’’ であるものとします。 −e オプションは、古いスクリプトとの後方互換性のためだけにありま す。 readonly [ readonly name=value 引数が指定されない場合、 readonly コマンドは、読み出し専用になっ ている変数の名前の一覧を表示します。 −p オプションが指定された場 合、読み出し専用になっている変数を、一行毎に ‘‘readonly name=value’’ の形式で表示します。これはシェルに再入力するのに適し ています。 |
set [ −/+abCEefIimnpTuVvx] [ −/+o longname] [ −c string] [−− arg...]
set コマンドは 3 通りの異なった機能を持ちます。 引数を指定しなかった場合、短かい形式でも長い ‘‘−/+o longname’’ と いう形式であっても、 引数リストの処理の節で説明されているように、 指定されたオプションの設定またはクリアを行います。 ‘‘−−’’ オプションが指定された場合、 set はシェルの位置パラメータ を、引き続く引数で置き換えます。 ‘‘−−’’ オプションの後に引数が続 かない場合、すべての位置パラメータはクリアされ、 ‘‘shift $#’’ コ マンドを実行するのと等価になります。位置置換パラメータとして引数 を指定するとき、 ‘‘−−’’ フラグは省略可能です。これはお勧めできま せん。なぜなら、最初の引数はマイナス記号 (-) またはプラス記号 (+) で開始するかもしれないからです。これらは、 set コマンドが、オプ ションの有効化または無効化の要求であると解釈してしまいます。 setvar variable value variable=value |
shift [n]
位置パラメータを n 回シフトします。 n を指定しない場合 1 回シフト します。 1 回のシフトにより、$2 の値が $1 に、$3 の値が $2 に代入 されます (以下同様)。また、$# の値は 1 減少します。位置パラメータ がない場合、shift は何もしません。 trap [ type [name ...] ulimit [ −H が指定された場合、ハードリミットが設定ないし表示されます。ハー ドリミット値を下げることは誰にでもできますが、それを増やすことが できるのはスーパユーザだけです。オプション −S を指定した場合はソ フトリミットになります。リミット値を表示する場合、 −S か −H のい ずれか一方だけしか指定できません。デフォルトでは、表示はソフトリ ミット、設定はハード/ソフトリミット両方です。 オプション −a を指定すると ulimit コマンドは全リソースの設定値を 表示します。この場合、パラメータ limit は指定できません。 この他のオプションは、表示あるいは設定するリソースの種類を指定す るものです。これらは互いに排他的です。 −b sbsize −c coredumpsize −d datasize −f filesize −l lockedmem −m memoryuse −n nofiles −s stacksize −t time −u userproc −v virtualmem umask [mask] unalias [ unset [ wait [job] コマンド行編集 同様に、コマンド ‘‘set -o emacs’’ により emacs 風のコマンド行編集機能のサ ブセットを使うことができるようになります。 関連項目 |
歴史
sh コマンドは、 Version 1 AT&T UNIX で登場しました。 |
バグ
sh ユーティリティは、マルチバイト文字を認識しません。 FreeBSD 10.0 July 3, 2004 FreeBSD 10.0 |