名前 | 形式 | 機能説明 | エラー | 使用法 | 終了ステータス | ファイル | 属性 | 関連項目 | 警告 | 注意事項
/usr/xpg4/bin/sh ユーティリティは標準に準拠したシェルです。このユーティリティは /usr/bin/ksh のすべての機能を提供します。ただし、後述するように、動作が異なる場合を除きます。詳細については、「算術展開」の項を参照してください。
/usr/bin/ksh は、端末またはファイルから読み取られたコマンドを 実行するコマンドおよびプログラミング言語です。rksh は、標準コマンドインタプリタである ksh と比べて、機能の一部が制限されており、標準シェルよりも制限された機能を持った ログイン名や実行環境を設定します。シェルへの引数の意味については、後述の「呼び出し」を参照してください。
メタキャラクタ (metacharacter) は、次の文字のいずれかです。
; & ( ) | < > 復帰改行(NEWLINE) 空白文字 タブ
ブランク (blank) とは、タブ (TAB) または空白文字 (SPACE) のことです。識別子 (identifier) とは、英文字、数字、または下線の並びのことで、その先頭の文字は英文字または下線です。識別子は関数 (function) や変数 (variable) の名前として使用します。ワード (word) とは、引用符がつかない 1 つまたは複数のメタキャラクタで区切られた、文字の並びのことです。
コマンド (command) とは、シェル言語の文法にそった文字の並びのことです。シェルは各コマンドを読み取り、指定された動作を直接実行するか、または動作を実行するユーティリティを起動します。特殊コマンド (special-command) とは、個別のプロセスを作成しなくても、シェルが実行してくれるコマンドです。本書で述べる副作用が発生する場合を除き、ほとんどの特殊コマンドは それぞれ個別のユーティリティとして実装できます。
単純コマンド (simple-command) は、ブランクで区切られたワードの並びで、その前に変数代入リストを指定できます (後述の「環境」を参照) 。先頭のワードは、実行するコマンド名を指定します。残りのワードは、以下に述べる場合を除き、呼び出されたコマンドに引数として渡されます。コマンド名は引数 0 として渡されます (exec(2) を参照 ) 。単純コマンドの値 (value) は、正常終了した場合は終了状態の値、シグナルを受け取って異常終了した場合は、シグナル番号に 128 を足した値になります。シグナルの値については、signal.h(3HEAD) のリストを参照してください。なお、正常な終了状態の値 129 〜 255 と、シグナル番号 1 〜 127 を受け取って異常終了した場合の値を見分けることはできません。
パイプライン (pipeline) は、パイプ (|) で区切られた 1 つ以上のコマンドの並びです。最後のコマンドを除き、各コマンドの標準出力は pipe(2) によってその次のコマンドの標準入力と結合されます。各コマンドは、別々のプロセスとして実行されます。シェルは最後のコマンドが終了するのを待ちます。最後のコマンドの終了状態がパイプライン全体の終了状態となります。
リスト (list) は、;、&、&&、または | | で区切られた 1 つ以上のパイプラインの並びです。その並びの終わりに ;、&、または |& を記述することもできます。この 5 つの記号の中で、;、&、および |& の優先度は同じで、&& と | | の優先度より低くなります。&& と | | の優先度は同じです。セミコロン (;) によって、直前のパイプラインが順次実行されます。アンパサンド記号 (&&) によって、直前のパイプラインが非同期的に実行されます (つまりシェルはパイプラインが終了するのを待ちません ) 。|& という記号によって、親シェルに対して双方向パイプが確立された、直前のコマンドまたはパイプラインが非同期的に実行されます。
生成されたコマンドの標準入出力は、親シェルが特殊コマンドの read および print (後述「特殊コマンド」を参照) の -p オプションを使用して書き込み、読み取ることができます。&& ( または | |) という記号によって、直前のパイプラインが 0 (または ゼロ以外) の終了ステータスを返した場合にだけ、その後のリストが実行されます。コマンドの区切りとして、セミコロンの代わりに任意の数の復帰改行を list に指定できます。
コマンドは、単純コマンドまたは以下のいずれかです。特に断わりのないかぎり、コマンドが返す値は、そのコマンド中で最後に実行された単純コマンドの値です。
for コマンドが実行されるたびに、identifier は in word リストから次に得られる word に設定されます。in word . . . を省略すると、for コマンドは、設定された各定位値パラメータに対して、do list を 1 回実行します (後述の「パラメータ置換」を参照)。in word リストの word がなくなると、実行は終了します。
select コマンドは、標準エラー (ファイル記述子 2) に、一群のワードを各々の前に番号を付けて出力します。in word . . . を省略すると、定位値パラメータが使用されます ( 後述の「パラメータ置換」を参照 ) 。PS3 プロンプトが出力され、標準入力から行が読み取られます。この行が、リストに示された word のいずれかの番号からなる場合、identifier が示す変数の値はこの番号に該当する word に設定されます。この行が空の場合は、再び選択リストを出力します。空でない場合は、identifier 変数の値を NULL
に設定します ( 後述の「ブランクの解釈」を参照
) 。標準入力から読み取った行の内容は、REPLY というシェル変数に保存します。break またはファイルの終わり (EOF
) に行き当たるまで、選択が発生するたびに list が実行されます。list の実行によって REPLY 変数が NULL
に設定されると、2 番目の選択をプロンプトする PS3 の表示前に選択リストが出力されます。
case コマンドは、word に一致する最初の pattern に対応した list を実行します。pattern の形式は、ファイル名生成に使用される形式と同じです ( 「ファイル名生成」の項を参照 ) 。
if の後の list を実行後、list が 0 の終了ステータスを返すと、最初の then の後の list を実行します。それ以外の場合、elif の後の list を実行します。この値が 0 の場合、2 番目の then の後の list を実行します。これが失敗すると、else list を実行します。else list も then list も実行しない場合、if コマンドは 0 の終了ステータスを返します。
while コマンドは、while list を繰り返し実行し、list 中の最後のコマンドの終了ステータスが 0 の場合、do list を実行します。それ以外の場合、ループは終了します。do list 中のコマンドを実行しない場合、while コマンドは 0 の終了ステータスを返します。ループ終了条件の判定を逆にするには、while の代わりに until を使用します。
別の環境で list を実行します。なお、入れ子において 2 つの開いた括弧を連続して記述する場合、後述の算術評価を避けるために空白を 挿入する必要があります。
単に list を実行します。なお、メタキャラクタの ( と ) とは異なり、{ と } は「予約語」なので、認識されるためには行の始めまたは ; の後に現れる必要があります。
expression が示す式を評価し、その値 が真のとき 0 の終了ステータスを返します。expression の説明については、後述の「条件式」を参照してください。
identifier で参照される関数を定義します。{ と } の間のコマンド群 ( list) が関数の本体となります (後述の「関数」参照) 。
pipeline を実行し、標準エラーに経過時間、ユーザー時間、およびシステム時間を出力します。
下記のワードは、コマンドの最初に現れたとき、および引用符をつけずに記述されたときに 「予約語」として認識されます。
! if then else elif fi case esac for while until do done { } function select time [[ ]] |
# でワードを始めると、そのワードおよび以降の 復帰改行までの文字がすべて無視されます。
各コマンドの最初のワードに別名 (alias) が定義されている場合、そのワードは別名のテキストに置き換えられます。別名は任意の数の文字で構成されます。別名に使用できない文字は、メタキャラクタ、引用符、ファイル展開文字、パラメータ置換文字、コマンド置換文字、= です。代入する文字列としては、前述のメタキャラクタを含む有効な シェルスクリプトを指定できます。置換されたテキスト内にある各コマンドの最初のワードは、置換対象のものを除き、別名についてチェックされます。別名の最後の文字がブランクの場合、別名の後のワードも別名置換についてチェックされます。別名を使用すれば、特殊組み込み型コマンドを再定義できますが、前述の予約語の再定義はできません。別名は alias コマンドで作成、表示、エクスポートでき、unalias コマンドで削除できます。エクスポートされた別名は、名前指定で起動されたスクリプトに対して引き続き有効ですが、シェルを起動 ( 後述の「呼び出し」を参照 ) するたびに初期化し直す必要があります。再帰的に別名をつける際に無限ループの発生を防ぐため、シェルが現在その同じ名前の別名を処理中でなければ、ワードは別名の値に置換されます。処理中であれば置換されません。
別名化はスクリプト読み取り時に実行されますが、スクリプト実行中には行われません。したがって別名を有効にするには、別名を参照するコマンドの読み取り前に alias コマンドで定義しておく必要があります。
別名は、完全パス名の省略形としてよく使用されます。別名機能のオプションを使えば、別名の値を、該当するコマンドの完全パス名に自動的に設定できます。これらの別名を検索済み ( tracked) 別名と呼びます。検索済み別名の値は、対応するコマンドを最初に検索するときに定義され、PATH 変数を再設定するたびに未定義になります。これらの別名は検索済みのままとなり、次回の参照時に値が再定義されます。複数の検索済み別名がシェル中にコンパイルされます。set コマンドの -h オプションは、各々の参照されたコマンド名を 検索済み別名にします。
以下に示す「エクスポート済み別名」 はシェルにコンパイルされ組み込まれますが、設定解除または再定義が可能です。
autoload='typeset -fu' false='let 0' functions='typeset -f' hash='alias -t' history='fc -l' integer='typeset -i' nohup='nohup ' r='fc -e -' true=':' type='whence -v' |
後方のブランク文字と予約語に関する例を示します。ユーザーが次のように入力したとします。
$ alias foo="/bin/ls " $ alias while="/" |
$ while true > do > echo "Hello, World" > done |
すると Hello, World という文字列が画面上に無限に現れます。一方、次のように入力すると、結果は / の ls 出力となります。
$ foo while |
foo に対する別名置換は空白文字で終わりとなるため、次のワードが置換用にチェックされます。次のワード while も別名化されているので、置換が行われます。つまり while の位置がコマンド名として正しくないために、予約語とは認識されないのです。
以下のように入力すれば、while は通常どおり予約語と見なされます。
$ foo; while |
別名置換を実行すると、各ワードは引用符なしの ~ で始まっているかどうかチェックされます。結果が真なら、/ までのワードに一致するユーザー名が 存在するかどうかチェックされます。存在すれば、~ および一致したワード (ログイン名) は、一致したユーザーのログインディレクトリに置き換えられます。これをチルド置換と呼びます。一致するユーザー名が見つからない場合、元のテキストは変更を受けません。~ が単独で指定された場合、または後ろに / を伴って指定された場合には、$HOME に置き換えられます。~ のあとに + または – を指定すると、それぞれ $PWD または $OLDPWD に置き換えられます。
また変数に代入する値が ~ で始まるときにも、チルド置換が試されます。
チルド接頭辞 ( tilde-prefix) はワードの先頭の引用符なしのチルド文字と、それに続く 文字列からなります。この文字列とは、ワード中に引用符がつかないスラッシュが 含まれていれば、その最初のスラッシュ直前までのすべての文字です。スラッシュが含まれていなければ、ワード中のすべての文字です。代入においては複数のチルド接頭辞を使用できます。つまりワードの先頭 ( 代入を示す等号の直後 ) 、引用符がつかない コロンのあと、およびその両方にも指定できます。代入におけるチルド接頭辞の終わりは、引用符がつかないコロンまたは スラッシュが最初に現れた地点です。チルド接頭辞中に引用符付きの文字が 1 つもなければ、先頭のチルドを除いた部分文字列は、ユーザーデータベース中に 登録されているログイン名の可能性があると見なされます。
移植性のあるログイン名には、環境変数 LOGNAME の項に記載されている文字以外の文字を含めることはできません。ログイン名が NULL のとき、すなわちチルド接頭辞がチルドだけからなるとき、チルド接頭辞は変数 HOME の値に置き換えられます。HOME が設定されていないと、その結果は予測できません。ログイン名が NULL でなければ、チルド接頭辞は getpwnam 関数を使って得られるログイン名に対応したホームディレクトリの パス名に置き換えられます。システムがログイン名を認識できない場合、結果は未定義です。
チルド展開は、通常はワードの先頭でのみ発生しますが、従来からの使用法に基づいた例外的な使い方もあります。次の例を見てください。
PATH=/posix/bin:~dgk/bin
これもチルド展開の対象となります。チルドがコロンの直後にあり、それに続く文字が 1 つも引用符で囲まれて いないためです。以下のような置換も発生しうるため、このようなチルド展開は抑止する方向も検討されました。
PATH=$(printf %s ~karels/bin : ~bostic/bin) for Dir in ~maart/bin ~srb/bin . do PATH=${PATH:+$PATH:}$Dir done
最初のコマンドでは、各ディレクトリにコロンが明示的に指定されています。いずれの場合も、シェルはすべてのディレクトリ名に対してチルド展開を実行します。どの名前も別個のワードとして認識するためです。
make -k mumble LIBDIR=~chet/lib
このような代入式は、シェル変数の代入と認識される条件を 満たしていないので、チルド展開は行われません。ただし、コマンドが展開を自身で行う場合は除きます (make は行いません) 。
将来的な仕様向けに、どのワード中でもチルド展開を強制的に実行する方法として、$~ という特殊な文字列が提供されています。
ワードは引用符をつけてはいけない、という規則なので、以下の指定は同等にはなりません。チルド展開が行われるのは、最後の指定だけです。
\\~hlj/ ~h\\lj/ ~"hlj"/ ~hlj\\/ ~hlj/ |
Korn シェルの ~+ と ~- 構造は、この規則を利用しているため、未定義のログイン名に チルドを付加した場合、処理の結果は予測できません。なお、一般に、誤ったログイン名にチルドを付加するとエラーになります。また HOME が未設定の場合、従来のシェルの中にはそれをエラーとするものもあるため、結果は予測できません。
コマンドが、ドル記号に続く括弧で囲まれている場合 (つまり $(command) の形式)、または一対の逆引用符 (``) で囲まれている場合には、その標準出力をワードの一部または全体として使用できます。その場合に標準出力に含まれる復帰改行は削除されます。2 番目の引用符で囲む形式では、コマンドの実行前に、引用符間の文字列に含まれる特殊引用符文字が処理されます ( 後述の「クォート」を参照 ) 。$(<file) というコマンド置換は、同じ動作で実行速度の速い $(<file) で代用することもできます。入出力リダイレクトを行わない特殊コマンドの多くは、別のプロセスを作成せずに実行されるからです。
コマンド置換を使うと、コマンド名をコマンドの出力で置き換えて しまうこともできます。コマンド置換は、コマンドを以下のように囲んで 記述すると行われます。
$(command)
または逆引用符を使って 次のように 指定します。
`command`
シェルは command をサブシェル環境で実行し、コマンド置換指定 (command のテキストと、それを囲んでいる $() または逆引用符 ) をコマンドの標準出力で置き換え、置換指定の最後にあるいくつかの連続した復帰改行文字を除去する ことにより、コマンド置換を展開します。出力の途中に埋め込まれている復帰改行文字は除去されません。ただし、IFS の値および現在有効な引用符によっては、それらの復帰改行文字はフィールド区切り文字とみなされて、フィールド分割時に削除されることもあります。
逆引用符形式のコマンド置換においては、バックスラッシュは文字そのものとしての意味を保持します。ただし以下に示す文字、つまりドル記号、逆引用符、バックスラッシュが直後に続く場合を除きます。
$ ` \\ |
対の相手となる逆引用符の検索は、直前の文字がバックスラッシュでない 逆引用符が見つかれば満たされます。この検索において、エスケープのない逆引用符がシェルコメント中、here-document ( 各種シェルで << を使用する機能 ) 、$(command) 形式のコマンド置換中、または引用符つきの文字列中で検出された場合、結果は未定義となります。先頭が `. . .` の並びで、終わりがこの並びではない、単一引用符または二重引用符で囲まれた文字列がある場合、結果は未定義となります。
$(command) 形式の指定では、左括弧の次の文字から、対応する右括弧までの文字が command を構成します。この command には、シェルのスクリプトとして正しいものであれば自由に使用できます。ただし、
入出力先のリダイレクト指定だけからなるスクリプトの場合、結果は予測できません。
単一のサブシェルの場合には、後述するような制限があります。
コマンド置換によって得られた結果は、あとでチルド展開、パラメータ展開、コマンド置換、または 算術展開を行うためにフィールド分割やパス名展開されることはありません。二重引用符に囲まれた内部でコマンド置換が発生しても、二重引用符の中で通常起こる 置換の結果に対しては行われません。
コマンド置換は入れ子にできます。逆引用符形式の内部で入れ子を 指定する場合には、内側の両方の逆引用符の直前にバックスラッシュを 記述する必要があります。以下に例を示します。
`\\`command \\``
逆引用符を使ったときの動作が一律でない、という問題は、$() 形式のコマンド置換を使えば解決できます。次の例を見てください。
コマンド | 出力 |
---|---|
echo '\\$x' | \\$x |
echo `echo '\\$x'` | $x |
echo $(echo '\\$x') | \\$x |
また、逆引用符形式は、埋め込まれたコマンドの内容に対して、従来から制限を持っていました。新しい $() 形式がどんな種類のスクリプトでも処理できるのに対し、逆引用符形式は、逆引用符を含んだ正しいスクリプトを扱えないことがあります。たとえば以下に示す例は、いずれも正しいスクリプトですが、右側は正しく処理されるのに対し、左側は処理されません。
echo ` | echo $( |
cat <<eeof | cat <<eeof |
a here-doc with ` | a here-doc with ) |
eof | eof |
` | ) |
echo ` | echo $( |
echo abc # a comment with ` | echo abc # a comment with ) |
` | ) |
echo ` | echo $( |
echo '`' | echo ')' |
` | ) |
このように逆引用符形式のコマンド置換は動作に一貫性がないため、コマンド置換を入れ子にしたり、複雑なスクリプトを埋め込もうとするアプリケーションには、使わない方がいいでしょう。
コマンド置換が以下のように単一のサブシェルからなる場合、
$( (command) )
移植性のあるアプリケーションであれば、$( と ( を 2 つのトークンに (空白を使って) 分離させる必要があります。これは算術展開と混同するのを避けるためです。
ドル記号に続く二重括弧で囲まれた算術式 (つまり ( $((arithmetic-expression)) ) の形式 ) は、二重括弧内の算術式の値に置き換えられます。算術展開は、算術式を評価して値を代入するための メカニズムを提供します。算術展開の形式は次のとおりです。
$((expression))
式すなわち expression は、あたかも二重引用符で囲まれているかのように扱われます。ただし、式の内部の二重引用符は特別な意味を持つとは見なされません。シェルは、パラメータ置換、コマンド置換、引用符削除のために、式の中のトークンをすべて展開します。
次にシェルはこの式を算術式と見なし、その値を置き換えます。算術式は、以下に述べる例外を除き、ISO C の規則に従って処理されます。
整数の算術だけが必須です。
sizeof() 演算子、および先頭と後尾の ++ と - - 演算子は必須ではありません。
選択、繰り返し、ジャンプの各ステートメントは サポートされていません。
/usr/bin/ksh は先頭の 0 から 9 までを 10 進定数として扱います。次の例を参照してください。
コマンド |
/bin/ksh の結果 |
/usr/xpg4/bin/sh の結果 |
---|---|---|
echo $((019+10 )) |
20 |
18 |
echo $((010+10 )) |
29 |
エラー |
[ 10 —le $((011)) ] |
真 |
偽 |
拡張機能として、上記リストに挙がっている算術式でも シェルが認識できる場合があります。式が不正な場合、展開は失敗に終わり、シェルはそのことを示す メッセージを標準エラー出力に書き出します。
# repeat a command 100 times x=100 while [ $x -gt 0 ] do command x=$(($x-1)) done
この機能は SunOS が提供するもので、UNIX オペレーティングシステムのバージョンが、オープンしたファイルに名前をつけるための /dev/fd ディレクトリをサポートしている 場合にだけ使用できます。<(list) または >(list) 形式の各コマンド引数は、list が示すプロセスを実行します。このプロセスは、/dev/fd 中のファイルに非同期的に接続されています。このファイルの名前が当該コマンドの引数となります。> が付いた形式を使用した場合、このファイルに書き出すことにより list への入力が可能となります。< の形式を用いると、引数として渡されたファイルには list プロセスからの出力が含まれます。次の例を見てください。
paste <(cut -f1 file1) <(cut -f3 file2) | tee >(process1) >(process2)
このコマンドは file1 からフィールド 1 をカットし、file2 からフィールド 3 をカットし、その両者をペーストし、その結果を process1 と process2 に送り、さらに標準出力上に書き出します。なおこのファイルは、引数としてコマンドに渡されますが、UNIX の pipe(2) になっているので、ファイル上で lseek(2) を行おうとするプログラムは動作できません。
パラメータ(parameter) は、識別子 (identifier)、1 つまたは複数の数字、または *、@、#、?、–、$、! の文字のいずれかです。変数 ( variable) は識別子が示すパラメータで、1 つの値 (value) といくつかの属性 ( attributes) を持ちます。属性がない場合もあります。特殊コマンド typeset を使用すれば、変数に値と属性を代入できます。シェルがサポートする属性については、typeset 特殊コマンドの項で後述します。エクスポートされた変数は、値と属性を環境に渡します。
シェルは一次元配列機能をサポートします。配列変数の要素は、添字 (subscript) によって参照されます。添字を指定するには、最初に [ 、次に算術式 ( 後述の「算術評価」を参照 ) 、その次に ] を記述します。配列に値を割り当てるときは、set -A name value . . .. を使用してください。添字の値は常に 0 から 4095 の範囲内で指定してください。配列を宣言する必要はありません。有効な添字を伴う変数参照は正当であり、必要に応じて配列が作成されます。添字なしで配列を参照するのは、0 番目の要素を参照することと同じ意味です。配列の identifier に添字として * または @ を用いると、個々の要素の値が置換されます (フィールド区切り文字で区切られます)。
以下の記述により変数に値を 代入することもできます。
name=value [ name=value ] . . .
name に -i という整数属性を設定すると、value は後述の算術評価を受けます。
定位値パラメータは数値により指定されるパラメータで、set 特殊コマンドで値を代入できます。$0 パラメータには、シェル起動時に 0 番目の引数から値を設定します。1 つまたは複数の数字からなるパラメータは、定位値パラメータになります。複数の数字からなる定位値パラメータは中括弧で囲む必要があります。
パラメータの展開は以下の形式で記述します。
${expression}
ここで expression は、対応する } の直前までのすべての文字を含みます。なおバックスラッシュによりエスケープされている } や引用符で囲まれた文字列内の }、および埋め込まれた算術展開、コマンド置換、変数展開の中の文字は、対応する } の検索の対象とはなりません。
パラメータ展開の最も単純な形式は次のとおりです。
${parameter}
parameter が値を持っていれば置き換えられます。
パラメータの名前と記号は、中括弧 ({}) で囲むこともできます。この中括弧は、複数の数字からなる位置パラメータ、および名前の一部として 解釈される恐れのあるような文字が parameter. . . に続く場合を除いては、省略可能です。対となる閉じる中括弧は、括弧のレベルを数えながら、引用符で囲まれた文字列やコマンド置換をスキップして見つけられます。
パラメータの名前や記号が中括弧で囲まれていない場合、正当な名前となりうる最長のものが展開に使われます。その名前が表す記号が存在しているかどうかは問いません。シェルが名前の境界を決定するために入力を走査するとき、どの名前がすでに定義されているかをシェルが知っていても、それに影響されることはありません。たとえば F というシェル変数が定義されているとき、以下のコマンドを実行したとします。
echo $Fred |
このとき、$F のあとに red が表示されるようなことはありません。正しい名前となりうる最長の文字列は Fred であり、そのような名前は定義されていないためです。
二重引用符内でパラメータ展開が発生した場合、
展開結果に対してはパス名展開は行われません。
展開結果に対しては、@ の場合を除きフィールド分割は行われません。
また、以下に示す形式を使って、パラメータ展開を変更することが可能です。word の値が必要となる場合 ( 後述するように parameter の状態による ) には、word チルド展開、パラメータ展開、コマンド置換、および算術展開の対象となります。word が必要でなければ、展開は行われません。なおパラメータ展開の変更指定を区切る文字 } は、先ほど述べた方法、さらに dquote でも述べるような方法で決定されます。たとえば、${foo-bar}xyz} という指定は、foo が設定済みであれば foo の展開のあとに文字列 xyz} が続き、foo が設定されていなければ文字列 barxyz} となります。
「デフォルト値の使用」。parameter が未設定または NULL の場合、word の展開結果が代入されます。それ以外の場合には parameter の値が代入されます。
「デフォルト値の割当」。parameter が未設定または NULL の場合、word の展開結果が parameter に割り当てられます。どのような場合でも、parameter の最終的な値が代入されます。この割当方法は変数だけに使用可能で、位置パラメータや特殊パラメータには使用できません。
「未設定または NULL のときエラー表示」。parameter が未設定または NULL の場合、word の展開結果 ( または word 省略時は未設定を表すメッセージ ) が標準エラー出力に書き出され、シェルは ゼロ以外の終了ステータスで終了します。それ以外の場合には、parameter の値が代入されます。対話型シェルでは終了しません。
「代替値の使用」。parameter が未設定または NULL の場合、NULL が代入されます。それ以外の場合には、word の展開結果が代入されます。
前述のパラメータ展開では、形式中にコロンを使うとパラメータが未設定または NULL であることのテストとなり、コロンを省略すると パラメータが未設定であることのテストとなります。コロンの役割を以下の表にまとめます。
パラメータが | パラメータが | パラメータが | |
NULL以外に設定 | NULLに設定 | 未設定 | |
${parameter:-word} | parameter | word | word |
に置換 | に置換 | に置換 | |
${parameter-word} | parameter | NULL | word |
に置換 | に置換 | に置換 | |
${parameter:=word} | parameter | word | word |
に置換 | を代入 | を代入 | |
${parameter=word} | parameter | parameter | NULL |
に置換 | に置換 | を代入 | |
${parameter:?word} | parameter | エラー | エラー |
に置換 | 終了 | 終了 | |
${parameter?word} | parameter | NULL | エラー |
に置換 | に置換 | 終了 | |
${parameter:+word} | word | NULL | NULL |
に置換 | に置換 | に置換 | |
${parameter+word} | word | word | NULL |
に置換 | に置換 | に置換 |
この表で、「 . . . に置換」は、式が表に示すものに置き換えられることを表します。また「 . . . を代入」は、パラメータにその値が代入され、さらに式を置き換えることを表します。
「文字列の長さ」。パラメータの値の長さを文字単位で示します。parameter が * または @ のとき、$1 を始めとしてすべての定位置パラメータ (フィールド区切り文字で区切られている) が置き換えられます。
以下に示す 4 種類のパラメータ展開は、いずれも部分文字列処理用のものです。どの場合でも、パターンの評価には、正規表現ではなく パターンマッチング表現 (patmat を参照) が使われます。parameter が * または @ のとき、$1 を始めとしてすべての定位置パラメータ ( フィールド区切り文字で区切られている ) が置き換えられます。完全パラメータ展開文字列を二重引用符で囲んでも、以下の 4 種類のパターン文字列は引用符付きとはなりません。ただし中括弧の内部で文字列を囲んだ場合には、引用符付きとなります。
「最小の接尾辞パターンの削除」。word が展開されてパターンを生成します。そのあと parameter に対してパラメータ展開が行われ、接尾辞中の pattern と一致する最小部分が削除されます。
「最大の接尾辞パターンの削除」。word が展開されてパターンを生成します。そのあと parameter に対してパラメータ展開が行われ、接尾辞中の pattern と一致する最大部分が削除されます。
「最小の接頭辞パターンの削除」。word が展開されてパターンを生成します。そのあと parameter に対してパラメータ展開が行われ、接頭辞中の pattern と一致する最小部分が削除されます。
「最大の接頭辞パターンの削除」。word が展開されてパターンを生成します。そのあと parameter に対してパラメータ展開が行われ、接頭辞中の pattern と一致する最大部分が削除されます。
使用例:
${parameter:-word}
次の例では、x が NULL または未設定の場合にのみ ls が実行されます。なお $(ls) コマンド置換の表現方法については、前述の 「コマンド置換」の項で説明してあります。
${x:-$(ls)}
unset X echo ${X:=abc} abc
unset posix echo ${posix:?} sh: posix: parameter null or not set
set a b c echo ${3:+posix} posix
HOME=/usr/posix echo ${#HOME} 10
x=file.c echo ${x%.c}.o file.o
x=posix/src/std echo ${x%%/*} posix
x=$HOME/src/cmd echo ${x#$HOME} /src/cmd
x=/one/two/three echo ${x##*/} three
次のパラメータは、シェルが自動的に設定します。
定位置パラメータ数 (10 進数)
呼び出し時に、または set コマンドによってシェルに与えられたフラグ
最後に実行されたコマンドが返した 10 進数
このシェルのプロセス番号
初期設定時、_ というパラメータは、実行中のシェルまたはスクリプトの絶対パス名で、環境 ( environment) に引き渡される値。そのあと、このパラメータには直前のコマンドの最後の引数が代入される。このパラメータは、非同期式のコマンドに関しては設定されない。このパラメータは、メールのチェック時にも、一致する MAIL ファイルの名前を保持するために使用する
最後に呼び出されたバックグラウンドコマンドのプロセス番号
最後に失敗したシステムコールにより設定された errno の値。この値はシステムに依存し、デバッグ目的で使用される
実行中のスクリプトまたは関数内での現在行の行番号
cd コマンドで設定された、直前の作業ディレクトリ
getopts 特殊コマンドで処理された最後のオプション引数の値
getopts 特殊コマンドで処理された最後のオプション引数のインデックス
シェルの親のプロセス番号
cd コマンドで設定された、現在の作業ディレクトリ
この変数を参照するたびに、0 から 32767 間に均一に分散した乱整数を生成する。乱数の並びは、RANDOM に数値を代入すれば初期化できる
この変数は、引数指定のない select 文または read 特殊コマンドにより設定される
この変数を参照するたびに、シェルを起動してからの秒数が返される。この変数に値を代入すると、その値と代入処理実行時からの秒数との合計値が 参照時に返される
次の変数はシェルによって使用されます。
cd コマンドの検索パスを指定します。
この変数を設定すると、シェル編集モードと select リストの出力用の編集ウィンドウの幅がその値によって、定義されます。
この変数の値が emacs、gmacs、または vi で終わり、VISUAL 変数が設定されていないと、該当するオプション ( 後述の「特殊コマンド」中の set の項を参照 ) が有効になります。
この変数は、シェルが呼び出されたときに シェルによるパラメータ展開の対象となり、それにより得られた値が、現環境で実行するシェルコマンドを含んでいるファイルのパス名として用いられます。このファイルは実行可能形式でなくてもかまいません。ENV を展開した値が絶対パス名でない場合、結果は予測できません。ユーザーの実ユーザー ID と実効ユーザー ID が異なっていたり、実グループ ID と実効グループ ID が異なっていたりするとき、ENV は無視されます。
この変数を使って、そのシェル呼び出しだけに有効な 別名や他の項目を設定することができます。ENV が参照するファイルは $HOME/.profile とは異なります。つまり .profile が通常はセッション立ち上げ時に実行されるのに対し、ENV ファイルはシェル呼び出しの度に冒頭で実行されます。ENV の値はドットスクリプトと同じように解釈されます。つまりコマンドは現環境で実行され、ファイルは実行可能でなくてもかまいませんが、読み取り可能で ある必要があります。なお、ドットスクリプトでは PATH の検索が行われますが、ENV では行われません。これは 「トロイの木馬」型セキュリティ侵入から保護するために使われます。
fc コマンドのデフォルトのエディタ名を指定します。
関数定義の検索パスを指定します。デフォルトでは、PATH 変数に設定されているディレクトリを検索したあと、FPATH に設定されているディレクトリを検索します。実行可能ファイルを見つけると、現在の環境中で実行します。-u 属性を持つ関数を参照した場合、PATH 変数の前に FPATH のディレクトリを検索します。あらかじめ設定されている別名の autoload を使えば、-u 属性を持つ関数を生成できます。
内部フィールド区切り文字。通常は空白文字、タブ、復帰改行です。コマンドまたはパラメータの置換によって生じる コマンドワードを区切るときと、read 特殊コマンドでワードを区切る場合に使用します。$* 置換において引数を区切るときは、IFS 変数の最初の文字を使用します (後述の 「クォート」を参照) 。
シェル起動時にこの変数が設定されていると、その値はコマンド履歴 ( 後述の「コマンド再入力」を参照 ) を格納するために使用されるファイルのパス名になります。
シェル起動時にこの変数が設定されていると、このシェルで使用可能な入力済みコマンドの数が、この値以上になります。デフォルト値は 128 です。
cd コマンドのデフォルト引数 ( ホームディレクトリ ) を指定します。
LC_* 変数のデフォルト値を提供する変数を指定します。
この変数は、パターンマッチングにおける範囲式、同等クラス、および 複数バイト文字照合要素の動作を定義します。
シェルが文字を処理する方法を決定します。LC_CTYPE に有効な値が設定されていると、シェルは、そのロケールに合った文字を含む テキストやファイル名を表示および処理できます。環境に LC_CTYPE ( environ(5) を参照 ) が設定されていなければ、シェルの動作は環境変数 LANG によって決定されます。LC_ALL が設定されていれば、その内容が LANG 変数やその他の LC_* 変数より優先されます。
メッセージをどの言語で出力するかを表す変数を指定します。
未設定もしくは NULL の国際化変数に対するデフォルト値を指定します。国際化変数のいずれかが不正な値に設定されていると、ユーティリティは変数が 1 つも定義されていないように動作します。
この変数は、各行のコマンド実行前に、スクリプトまたは関数内での現在の 行番号 (1 から始まる連続した番号) を表す 10 進数に、シェルにより設定されます。ユーザーが LINENO を設定解除もしくは再設定すると、現在のシェルの動作中は、この変数が持つ特殊な意味は失われます。シェルが現在スクリプトも関数も実行していない場合、LINENO の値は予測できません。
この変数を設定すると、その値は選択 (select) リスト出力用のカラム長の決定に使用されます。選択リストは、LINES が示す行数の 3 分の 2 が一杯になるまで垂直に出力されます。
この変数をメールファイルの名前に設定し、さらに MAILPATH 変数を設定しない場合、シェルは指定されたファイルにメールが到着すると ユーザーに通知します。
この変数は、MAILPATH 変数または MAIL 変数で指定されるファイルが更新されたかどうかを、シェルが何秒ごとにチェックするかを指定します。デフォルト値は 600 秒です。この時間が経過すると、シェルは次のプロンプトを出す前に チェックします。
コロン (:) で区切ったファイル名のリストを指定します。この変数を設定すると、シェルは直前の MAILCHECK 秒間に発生した、指定ファイルに対する変更について ユーザーに通知します。各ファイル名のあとには ? と、出力されるメッセージを指定できます。メッセージは、出力に先立ち、$_ 変数に変更されたファイルの名前を代入する パラメータ置換処理を受けます。デフォルトメッセージは you have mail in $_ です。
LC_MESSAGES 処理用のメッセージカタログの場所を示す変数を指定します。
コマンド用の検索パスを指定します。(後述の「実行」を参照) rksh の下で実行する場合 ( .profile の場合を除く) 、PATH を変更することはできません。
この変数は、シェルを呼び出したプロセスのプロセス ID (10 進数) に対して、シェルにより設定されます。サブシェル中では、PPID は現在のシェルの親の値と同じ値に設定されます。たとえば echo $PPID と (echo $PPID) は同じ値を生成します。
この変数の値はパラメータ置換用に展開され、一次プロンプト文字列を定義します。デフォルトは $ です。一次プロンプト文字列内の文字 ! は、コマンド番号で置換されます ( 後述の「コマンド再入力」を参照 ) 。! を 2 つ連続して指定すると、プロンプト文字列の出力時に ! が 1 つ表示されます。
二次プロンプト文字列を指定します。デフォルトは > です。
select ループ内で使用する選択プロンプト文字列を指定します。デフォルトは #? です。
この変数の値は、パラメータ置換用に展開され、実行トレースの各行の前に出力されます。省略すると、実行トレースプロンプトは + になります。
シェルのパス名は環境内に保持されます。起動時に、この変数のベース名が rsh、rksh、または krsh の場合、シェルの機能は制限されます。
0 より大きい値に設定すると、PS1 プロンプトの発行後、指定された秒数以内に コマンドが入力されない場合、シェルは終了します。シェルのコンパイル時に、この値がユーザーが 超えられないような大きい値に設定されていることも あります。
この変数の値が emacs、gmacs、または vi で終わる場合、該当するオプション (後述の「特殊コマンド」中の set の項を参照) が有効になります。
シェルは、PATH、PS1、PS2、PS3、PS4、MAILCHECK、FCEDIT、TMOUT、および IFS にデフォルト値を割り当てますが、HOME、SHELL、ENV、および MAIL は、シェルによって設定されることはありません。ただし HOME は login(1) により設定されます。また一部のシステムでは、MAIL や SHELL も login で設定されることがあります。
パラメータとコマンドの置換後、置換の結果内でフィールド区切り文字 (IFS で発見されるもの) を検索し、その文字が現れた位置で分割します。分割された各々が引数となります。明示的な NULL 引数 ("" または ' ' は保持されます。暗示的な NULL 引数 (値を持たないパラメータにより生じるもの) は削除されます。
置換後、各コマンドワードは、*、?、[ を含んでいないかチェックされます。ただし -f オプションを設定していない場合にかぎります。これらの文字のいずれかがあると、そのワードはパターンとみなされます。このワードは、パターンと一致する、辞書編集方式の順にソートされたファイル名に置換されます。パターンと一致するファイル名が見つからない場合、ワードは変更されません。パターンをファイル名の生成に使用する場合、ファイル名の先頭のピリオド (.) または スラッシュ (/) 直後のピリオドは、明示的に一致させる必要があります (後者の場合はスラッシュ自体をも含む)。ピリオドで始まるファイル名は 括弧の中でピリオドのある次のようなパターンとは 一致しません。
ls .@(r*)
これは .restore というファイル名を検出しますが、ls @(.r*) は検出しません。パターンマッチングの他のケースでは、/ に続く . は特殊文字とはみなされません。
NULL 文字列を含め、任意の文字列と一致します。
任意の単一文字と一致します。
囲まれた文字のいずれかと一致します。2 つの文字を – で区切ると、その間にある任意の文字 ( その 2 つの文字も含む ) に一致します。先頭の [ の次の文字が ! である場合、[ ] で囲まれていない任意の文字と一致します。– は、最初の文字または最後の文字として 文字セットに挿入できます。
pattern-list は、| で区切られた 1 つまたは複数のパターンのリストです。複合パターンは、次のうちの 1 つまたは複数で形成することができます。
指定されたパターンのいずれかと任意に一致します。
指定されたパターンの 0 回以上の発生と一致します。
指定されたパターンの 1 回以上の発生と一致します。
指定されたパターンのうち 1 つだけと一致します。
指定されたパターンのうち 1 つだけを除き、あらゆるものと一致します。
前述の「定義」の項で示したメタキャラクタ の各々は、シェルに対して特別の意味を持ち、クォートしないかぎり、ワードの終わりを表します。文字は、その前に \\ を指定すればクォートされます。つまりその文字自身を 示すことができます。\\ NEWLINE の対は削除されます。一対の単一引用符 ( '') で囲まれた文字はすべてクォートされます。単一引用符内にさらに単一引用符を指定することはできません。一対の二重引用符 ("") で囲まれた文字列内では、パラメータとコマンドの置換が発生し、\\ は \\ 、`、"、$ をクォートします。$* と $@ の意味は、クォートされていないとき、あるいはパラメータの代入値もしくはファイル名として 使用されるときは同一です。ただしコマンド引数として使用するとき、$* は $1d $2d . . . と同じになります ( d は IFS 変数の最初の文字です)。一方、$@ は $1 $2 . . . と同じになります。一対の逆引用符 (``) で囲まれた中では、\\ は \\、`、$ といった文字をクォートします。逆引用符を二重引用符内で指定すると、\\ も " という文字をクォートします。
予約語や別名中のいずれかの文字をクォートすれば、その予約語が持つ特別な意味はなくなります。なお以下に説明する関数や特殊コマンドに関しては、その名前をクォートしても、関数名またはコマンド名としての 認識を変えることはできません。
let という特殊コマンドには、整数演算を実行する機能が提供されています。評価は long 演算を使用して実行します。定数は [ base# ] n 形式とします。ここで base は底を表す 2 から 36 の範囲の 10 進数で、n はその底における数です。base を省略すると、底は 10 となります。
算術式は、C 言語での式と同一の構文、優先度、および結合規則を使用します。++、– –、?:、, 以外のすべての整数演算子がサポートされています。算術式内では、パラメータ置換構文を使用しなくても、名前で変数を参照できます。変数を参照すると、その値は算術式として評価されます。
変数の内部整数表記は、typeset 特殊コマンドの -i オプションで指定できます。算術評価は、-i 属性を備えた変数に対する各代入値について実行されます。底を指定しないと、変数に対する最初の代入が底を決定します。この底は、パラメータ置換が発生する際に使用されます。
算術演算子の多くはクォートしなければならないので、代替形式の let コマンドが提供されています。(( で始まるコマンドについては、対応する )) までの文字はすべてクォートされた表現とみなします。具体的に言うと、((. . .)) は let " . . ." と同じ意味です。
シェルは、対話的に使用すると、コマンドを読み取る前に PS1 のパラメータ展開値によるプロンプトを発行します。復帰改行を入力したあとで、コマンドを完了するためにさらに入力が必要な場合は、2 次プロンプト (つまり PS2 の値) が出力されます。
条件式 ( conditional expression ) は、ファイルの属性をテストしたり文字列を比較するときに、複合コマンドの [[ とともに使用します。[[ と ]] の間のワードについてはワード分割とファイル名生成を実行しません。各条件式は、次の単項式または 2 項式をいくつか組み合わせて構築できます。
file が存在する場合、真です。
file が存在し、ブロック型特殊ファイルである場合、真です。
file が存在し、文字型特殊ファイルである場合、真です。
file が存在し、ディレクトリである場合、真です。
file が存在していれば、真です。
file が存在し、通常ファイルである場合、真です。
file が存在し、setgid ビットがセットされている場合、真です。
file が存在し、スティッキ・ビットがセットされている場合、真です。
string の長さが 0 ではない場合、真です。
option という名前のオプションが有効の場合、真です。
file が存在し、FIFO 特殊ファイルまたはパイプである場合、真です。
file が存在し、現在のプロセスで読み取り可能な場合、真です。
file が存在し、サイズが 0 より大きい場合、真です。
fildes が示すファイル記述子番号がオープンされていて、端末デバイスに対応している場合、真です。
file が存在し、setuid ビットがセットされている場合、真です。
file が存在し、現在のプロセスで書き込み可能な場合、真です。
file が存在し、現在のプロセスで実行可能な場合、真です。file が存在し、ディレクトリである場合、現在のプロセスにはそのディレクトリに対する 検索権があります。
string の長さが 0 の場合、真です。
file が存在し、シンボリックリンクである場合、真です。
file が存在し、このプロセスの実効ユーザー ID が所有している場合、真です。
file が存在し、そのグループがこのプロセスの実効グループ ID と一致する場合、真です。
file が存在し、ソケットである場合、真です。
file1 が存在し、file2 より新しい場合、真です。
file1 が存在し、file2 より古い場合、真です。
file1 と file2 が存在し、同一のファイルを参照する場合、真です。
string が NULL 文字列でない場合、真です。
string が pattern と一致する場合、真です。
string が pattern と一致しない場合、真です。
string1 と string2 が同じ場合、真です。
string1 と string2 が同じでない場合、真です。
カテゴリ LC_COLLATE に設定されるロケールに適切であると 解釈された文字列を比較し、string1 が string2 より小さい場合、真です。
カテゴリ LC_COLLATE に設定されるロケールに適切であると 解釈された文字列を比較し、string1 が string2 より大きい場合、真です。
exp1 が exp2 と等しい場合、真です。
exp1 が exp2 と等しくない場合、真です。
exp1 が exp2 未満である場合、真です。
exp1 が exp2 より大きい場合、真です。
exp1 が exp2 以下の場合、真です。
exp1 が exp2 以上の場合、真です。
上記の式の各々において、file が /dev/fd/n という形式の場合 ( n は整数 )、記述子番号が n でオープンされているファイルでテストします。
以下のいずれかを使用すれば、これらの基本式から複合式を構築することができます。優先度の高いものから順に並べてあります。
expression が真の場合、真です。式のグループ化に使用します。
expression が偽の場合、真です。
expression1 と expression2 が両方とも真の場合、真です。
expression1 と expression2 のどちらかが真の場合、真です。
コマンド実行前に、シェルが解釈する特殊表記法によって入出力先を変更 ( リダイレクト ) できます。以下は、単純コマンド内の任意の位置および コマンドの前後に指定することができ、起動されたコマンドには引き渡されません。以下に示す場合を除き、word または digit を使用する前にコマンドとパラメータの置換が発生します。ファイル名生成が発生するのは、パターンが 1 つのファイルだけと一致し、さらにブランク解釈が実行されない場合だけです。
word というファイルを標準入力 ( ファイル記述子 0) として使用します。
word というファイルを標準出力 ( ファイル記述子 1) として使用します。ファイルが存在しない場合は作成します。ファイルが存在し、かつ noclobber オプションが有効の場合、エラーになります。その他の場合は、ファイルの長さが 0 になります。
> と同一です。ただし、これは noclobber オプションを無視します。
word というファイルを標準出力として使用します。ファイルが存在する場合、(EOF までシークしたあと ) そのファイルに出力を追加します。ファイルが存在しない場合は、ファイルを作成します。
word というファイルを読み取りおよび書き込み用に 標準入力としてオープンします。
シェルへの入力として word と同一の行まで、または EOF まで読み取ります。word に対しては、パラメータ置換やコマンド置換や ファイル名生成を実行しません。here-document が生成されて標準入力になります。word のいずれかの文字がクォートされている場合、ドキュメントの文字はいっさい解釈されません。クォートされている文字がなければ、パラメータとコマンドの置換が発生し、\\NEWLINE が無視されます。また \\ を使用して、\\ 、$、`、および word の最初の文字をクォートす必要があります。– を << のあとに付加すると、word とドキュメントから先行タブをすべて取り除きます。
digit が示すファイル記述子から複製したものを 標準入力として使用します ( dup(2) を参照 ) 。同様に、標準出力への複製には >&digit を使用します。
標準入力をクローズします。同様に、標準出力については >&– を使用します。
並行プロセスからの入力を標準入力へ移動します。
並行プロセスへの出力を標準出力へ移動します。
上記のいずれかの前に数字が付く場合、その値が ( デフォルトの 0 または 1 のかわりに ) 該当ファイルに対応した ファイル記述子となります。
. . . 2>&1
ファイル記述子 2 をファイル記述子 1 から複製して、書き込み用にオープンします。
リダイレクトを指定する場合、記述する順序が重要になります。シェルは、リダイレクト指定を左から右へ評価します。
. . . 1>fname 2>&1
上記の例では、まず fname というファイルにファイル記述子 1 を関連付けます。次に、ファイル記述子 1 に関連するファイル ( つまり fname) に、ファイル記述子 2 を関連付けます。リダイレクトの向きが逆であれば、まずファイル記述子 2 を端末に関連付け ( ファイルを記述子 1 がすでに端末に関連付けられているとみなし ) 、次にファイル記述子 1 をファイル fname に関連付けます。
ジョブ制御が有効でない場合に コマンドのあとに & を指定すると、コマンドにおけるデフォルトの標準入力は /dev/null という空ファイルになります。その他の場合、コマンドを実行するための環境には、起動側シェルのファイル記述子 ( 入出力指定で変更可能 ) が含まれます。
環境は、通常の引数リストが 実行されるプログラムに引き渡される場合と同様の方法で引き渡される、名前と値の対です ( environ(5) を参照 ) 。名前は識別子、値は文字列である必要があります。シェルが環境と対話する方法はいくつかあります。シェルは、起動されると、環境を走査して、見つけた名前ごとに変数を作成し、対応する値を設定し、さらに export というマークを付けます。実行されるコマンドは環境を引き継ぎます。ユーザーがこれらの変数の値を変更したり 新しい変数を作成したときには、export コマンドまたは typeset -x コマンドを使用すれば それらの値が環境の一部になります。したがって、実行されるコマンドが参照する環境は、シェルが最初に引き継いだ「名前 = 値」の対 ( その値は現在のシェルで変更可能 ) に、export コマンドまたは typeset -x コマンドで指定したものを加えたものになります。
1 つまたは複数の変数代入を先頭に付加すれば、単純コマンドおよび関数の環境を 拡張できます。変数代入引数は、identifier=value という形式のワードです。
TERM=450 cmd args |
および
(export TERM; TERM=450; cmd args) |
上記 2 つの例は同じことを意味します。これは cmd の実行に関してだけにかぎります。ただし、cmd が「特殊コマンド」の項で示す * 印の付いたコマンドの場合を除きます。
-k フラグを設定すると、変数代入引数はすべて環境に格納されます。これらの引数がコマンド名のあとに指定された場合も同様です。以下の例では、まず a=b c を、次に c を表示します。
echo a=b c set -k echo a=b c |
この機能は、シェルの初期バージョン用に作成された スクリプトで使用するためのものです。新しいスクリプトには使用しないでください。将来、この機能がなくなる可能性があるからです。
前述の 「コマンド」 の項で説明した function は予約語であり、シェル関数の定義に使用します。シェル関数は内部で読み取られ、保存されます。別名は、関数を読み取る際に解釈されます。関数はコマンドと同様に実行され、引数は定位置パラメータとして渡されます ( 後述の「実行」を参照 ) 。
関数は、呼び出し側と同一のプロセスにおいて実行され、すべてのファイルと現在の作業ディレクトリを呼び出し側と共有します。呼び出し側が受け取るトラップは、関数内部でそのデフォルトの動作に再設定されます。関数が受け取らないかあるいは無視するトラップ条件があると、関数は終了し、その条件は呼び出し側に引き渡されます。
関数内部で設定された EXIT に基づくトラップは、関数が呼び出し側の環境で完了したあとに実行されます。これは、非 POSIX スタイルの関数についてのみ真です。非 POSIX スタイルの関数は次のように宣言されます。
function func一方、POSIX スタイルの関数は次のように宣言されます。
func()
通常、変数は呼び出し側プログラムと関数間で共有されます。ただし、関数内で使用される typeset 特殊コマンドは、適用範囲として 現在の関数とそれが呼び出す関数すべてを含む 局所変数を定義します。
return という特殊コマンドは、関数の呼び出しから戻るときに使用します。関数の中でエラーが起こると、呼び出し側に制御が戻ります。
全関数の名前を一覧表示するには typeset +f と入力します。全関数の名前とともに関数のテキストも表示するには typeset -f と入力します。特定の関数のテキストだけを表示するには typeset -f function-names と入力します。unset 特殊コマンドの -f オプションを使えば、関数を未定義状態にすることができます。
通常、シェルがシェルスクリプトを実行するとき、関数は設定を解除されます。typeset コマンドの -xf オプションによって、別個にシェルを起動しなくても 実行されるスクリプトに関数をエクスポートできます。シェルを起動して定義する必要がある関数は、typeset の -xf オプションで ENV ファイルに指定する必要があります。
関数とは、一群のコマンド ( compound command ) を、新たな定位置パラメータを指定して 単純コマンドとして呼び出すために、ユーザーが 定義した名前です。関数は「関数定義コマンド」を使って定義します。
関数定義コマンドの形式を以下に示します。
fname() compound-command[io-redirect . . .] |
fname は名前でなければならず、これが関数名となります。実装によっては拡張機能として、他の文字を関数名に使うことを 許しているものもあります。その場合、関数と変数とを別個の名前領域で管理します。
関数定義コマンド中の () は、2 つの演算子で構成されます。したがって、fname、(、および ) をブランク文字で区切ることもできますが、省略も可能です。
引数 compound-command は、関数呼び出しにより実行する一群のコマンドです。
関数が宣言されたとき、wordexp の展開は compound-command や io-redirect に対しては行われません。すべての展開処理は、通常のように、関数が呼び出されるたびに行われます。同様に、io-redirect( 省略可能 ) が示す入出力のリダイレクトや、compound-command 中の変数割当は、関数定義時ではなく関数の実行時に行われます。
関数を実行すると、特殊組み込みユーティリティの項で説明するように、構文エラーや変数割当用の機能が与えられます。
関数名が単純コマンドとして指定されると、それに対応した compound-command が実行されます。その単純コマンドに指定したオペランドが、compound-command の実行中、一時的に位置パラメータとなります。特殊パラメータ # も、オペランド数を示す値に変更されます。特殊パラメータ 0 は変更されません。関数の実行が終了すると、定位置パラメータや # の値は、関数実行前の値に復元されます。compound-command 中で特殊組み込みコマンド return が実行された場合、関数実行は終了し、関数呼び出しの次のコマンドから 処理が再開されます。
単純コマンドが記述できるところであれば、関数定義を記述できます。以下に例を示します。
# If variable i is equal to "yes", # define function foo to be ls -l # [ "$i" = yes ] && foo() { ls -l } |
関数定義コマンドの終了ステータスは、関数が正常に宣言されれば 0 で、そうでなければゼロより大きい値です。関数呼び出しの終了ステータスは、関数によって最後に実行されたコマンドの 終了ステータスです。
set コマンドの monitor オプションを有効にすると、対話型シェルが job を各パイプラインと関連付けます。このオプションは、jobs コマンドが表示する現在のジョブのテーブルを維持し、これらのジョブに整数番号を割り当てます。ジョブを & で非同期に起動すると、シェルは次の形式の行を表示します。
[1] 1234 |
非同期に起動されたジョブはジョブ番号 1 であり、プロセス ID が 1234 であるプロセスが 1 つ ( トップレベル ) あることを示します。
ジョブを実行中であり、別に実行したいジョブがある場合、‸Z (CTRL-Z) キーを押せば、現在のジョブに STOP シグナルが送信されます。そうするとシェルは通常、ジョブが「停止」されたことを示し、プロンプトを表示します。これで、このジョブの状態を bg コマンドでバックグラウンドで処理するか、あるいは他のコマンドを実行してから、fg というコマンドで ジョブをフォアグラウンドに移すことができます。‸Z は直ちに有効になります。つまり ‸Z は、保留中の出力や読み取られていない入力が 直ちに中止されるという点で、割り込みに似ています。
バックグラウンドで実行中のジョブは、端末から読み取ろうとすると停止します。通常バックグラウンドジョブは出力を生成できますが、stty tostop というコマンドを指定すればこの出力生成も抑止することができます。この tty オプションを設定すると、バックグラウンドジョブは、入力の読み取り時と同様に出力を生成しようとすると停止します。
シェル内のジョブを参照する方法はいくつかあります。ジョブは、そのジョブのプロセス ID または以下のいずれかで参照できます。
number が示す番号のジョブ
コマンド行が string で始まっていたジョブ
コマンド行が string を含んでいたジョブ
現在のジョブ
%% と同じ
直前のジョブ
シェルは、プロセスの状態が変更すると、直ちにそれを検出します。ジョブがブロックされてそれ以上進めない状態になると、シェルはそのことをユーザーに通知します。ただし、ユーザーの作業の妨げにならないよう、この通知はプロンプトを発行する直前にだけ行います。
モニターモードが有効のとき、完了した各バックグラウンドジョブは、CHLD に設定されているトラップを起こします。
ジョブの実行中または停止中にシェルを終了しようとすると、「停止中 (実行中) のジョブがある ( You have stopped (running) jobs. )」という警告を受けます。jobs コマンドを使用すれば、どのジョブが該当するのかを確認できます。これを実行するか、あるいは直ちにシェルを再終了しようとすると、シェルは 2 度目の警告は出さず、停止中のジョブは終了します。nohup コマンドで起動したジョブの実行中に ログアウトを行うと、次のような警告メッセージを受けます。
You have jobs running.
実際にログアウトを行うには、ログアウトを 2 回行う必要がありますが、その場合でもバックグラウンドジョブは 実行し続けます。
起動されたコマンドに対する INT シグナルと QUIT シグナルは、コマンドの後ろに & が指定され、ジョブの monitor オプションが有効でない場合、無視されます。その他の場合、シグナルは、シェルが親から引き継いだ値を持ちます ( ただし、後述の trap コマンドの説明を参照 ) 。
コマンドが実行されるたびに、上記の置換が実行されます。コマンド名は、後述の 「特殊コマンド」 のいずれかと一致する場合、現在のシェルプロセス内で実行されます。次に、コマンド名がユーザー定義関数のいずれかと 一致するかどうかチェックされます。一致する場合、定位置パラメータが保存され関数呼び出しの引数に再設定されます。関数が完了するか return を発行すると、定位置パラメータリストが復元され、関数内の EXIT に設定されているトラップが実行されます。関数の値は、最後に実行されたコマンドの値です。関数は現在のシェルプロセスでも実行されます。コマンド名が特殊コマンドやユーザー定義関数を示していない場合、プロセスが作成され、exec(2) を介してコマンドが実行されます。
PATH というシェル変数は、コマンドが置かれている ディレクトリの検索パスを定義します。ディレクトリ名は、コロン (:) で区切ります。デフォルトのパスは /bin:/usr/bin: です ( /bin、/usr/bin、および現在のディレクトリの順で指定 ) 。現在のディレクトリは、複数のコロンを連続して記述するか、パスリストの始めか終わりにコロンを付ければ指定できます。コマンド名に / が含まれている場合は、検索パスは使用されません。/ が含まれていなければ、パスにおける各ディレクトリに実行可能ファイルがあるか検索します。ファイルが実行権を持っているが、ディレクトリや a.out ファイルでない場合、シェルコマンドの入ったファイルとみなされます。そのファイルを読み取るときは、サブシェルが生成されます。この場合、エクスポートされていない別名、関数、および変数すべてが削除されます。括弧で囲まれたコマンドは エクスポートされていないものを削除することなく、サブシェルで実行されます。
端末装置から最近入力された、HISTSIZE が示す個数 ( デフォルトは 128 個 ) のコマンドのテキストは、履歴ファイルに保存されています。$HOME/.sh_history というファイルは、HISTFILE 変数が設定されていない場合、または変数が示すファイルが 書き込み不可能な場合に使用されます。シェルは、同じ名前の HISTFILE を使用する対話型シェルすべてのコマンド履歴を使用できます。fc という特殊コマンドは、このファイルの一部をリスト表示または編集するときに使用します。編集またはリスト表示すべきファイルの部分は、番号か、またはコマンドの最初の文字 (1 つまたは複数 ) を 指定することによって選択できます。単一のコマンドを指定することも、コマンドの範囲を指定することも可能です。fc の引数としてエディタプログラムが指定されていないと、FCEDIT という変数の値が使用されます。FCEDIT が未定義の場合は、/bin/ed が使われます。編集されたコマンドは、エディタを終了した時点で 表示および再実行されます。エディタ名に – を指定すると、編集段階がスキップされ、コマンドが再実行されます。この場合、old=new という形式の代入パラメータを使用すれば、実行前にコマンドを変更できます。たとえば、r が 'fc -e -' の別名として定義されているとき `r bad=good c' と入力すると、c という文字で始まるコマンドのうち最新のコマンドが、その記述中の最初の bad という 文字列が good に置き換えられて再実行されます。
通常、端末装置から入力されるコマンド行は、単に復帰改行 (RETURN または LINEFEED) をあとに伴います。emacs、gmacs、vi のいずれかのオプションが有効な場合、ユーザーはコマンド行を編集できます。いずれかのオプションを set すれば、対応する編集モードになります。編集オプションは、オプション名のいずれかで終了する値を VISUAL 変数または EDITOR 変数に代入するたびに、自動的に選択されます。
編集機能では、ユーザーの端末が RETURN を改行のないキャリッジリターンとして扱うことができ、空白文字 がスクリーン上の現在の文字を上書きする必要があります。
これらの編集モードは、ユーザーがウィンドウごしに 現在の行を見るという概念を実現します。ウィンドウ幅は、COLUMNS が定義されていればその値に、未定義の場合は 80 になります。ウィンドウ幅が小さすぎて、プロンプトを表示すると入力用に 8 カラム以上残すことができなくなる場合には、プロンプトは左端から切り捨てられます。行がウィンドウ幅から 2 引いたものより長いと、ウィンドウの終わりにマークを表示してユーザーに通知します。カーソルが移動し、ウィンドウの境界に達すると、ウィンドウはカーソルを中心としてセンタリングされます。行がウィンドウの右端を超えている場合、表示されるマークは > となります。同様に、左端を超えていれば < が、左右両端を超えていれば * が表示されます。
各編集モードでは検索コマンドにより 履歴ファイルを使用できます。パターンではなく文字列だけがマッチングされます。ただし文字列の先頭に ‸ があると、マッチング開始位置は行の先頭に限定されます。
emacs または gmacs オプションを有効にすると、それぞれに対応する編集モードに入ります。この 2 つのモードは、‸T の扱い方が異なるだけです。編集を行うには、訂正が必要な位置にカーソルを移動し、文字やワードを挿入または削除します。編集用のコマンドは、制御文字またはエスケープシーケンスで 入力します。本項の説明では、山型記号 ( ‸) を使って制御文字を示してあります。たとえば ‸F というのは CTRL–F を表します。つまり、CTRL ( コントロール ) キーを押した状態で f キーを入力します。このときシフトキーは押しません。なお、‸? は DEL ( 削除 ) キーを表します。
エスケープシーケンスの入力は M– を使って示してあります。たとえば M–f( メタ f と呼ぶ ) は、ESC キー ( ASCII コード 033 ) のあとに f を入力することを表します。同様に M–F は、ESC キーのあとに大文字の F を入力することを表します。
編集コマンドは、行のどこからでも実行できます。行の先頭だけではありません。特に断わりのないかぎり、編集コマンドの終わりを表すために改行キー ( RETURN キーまたは LINEFEED キー ) を入力する必要はありません。
カーソルを 1 文字分前進 ( 右方向 ) します。
カーソルを 1 ワード分前進 します。emacs エディタにおける「ワード」とは、英文字、数字、下線からなる文字列を意味します。
カーソルを 1 文字分後退 ( 左方向 ) します。
カーソルを 1 ワード分後退 します。
カーソルを現在の行の先頭に移動します。
カーソルを現在の行の終端に移動します。
現在の行において文字 char が次に現れる位置にカーソルを移動します。
現在の行において文字 char が前に現れた位置にカーソルを移動します。
カーソルとマークを入れ替えます。
( ユーザーが stty(1) で定義した削除キー。通常は ‸H または #) 直前の文字を削除します。
現在の文字を削除します。
現在のワードを削除します。
( メタ –Back Space ) 直前のワードを削除します。
直前のワードを削除します。
( メタ –DEL ) 直前のワードを削除します。なお、割り込み文字を ‸?( つまりデフォルトの DEL ) と定義している場合、このコマンドは動作しません。
emacs モードでは、現在の文字と次の文字とを入れ換えます。gmacs モードでは、直前の 2 つの文字を入れ換えます。
現在の文字を大文字にします。
現在のワードを大文字にします。
現在のワードを小文字にします。
現在カーソルが置かれている文字から 行の終端までをすべて削除します。なお、‸K の前に数値パラメータを入力した場合には処理が異なります。その値が現在の位置の番号より小さければ、その値が示す位置の文字から現在の文字までを削除します。その値が現在の位置の番号より大きければ、現在の文字からその値が示す位置の文字までを削除します。
カーソルのある文字からマークまでを抹消します。
カーソル位置からマークまでの 領域をスタックにプッシュします。
( ユーザーが stty(1) で定義した抹消キー。通常は ‸G または @) 現在の行を抹消します。2 つの kill 文字を連続して入力すると、そのあとの kill 文字は、改行を意味することになります。この機能は、プリンタ端末 ( 印字式端末 ) を使用している場合に便利です。
最後に削除されたデータを復元します。
改行して、現在の行を印刷します。
( NULL 文字 ) マークを設定します。
( メタ–空白文字 ) マークを設定します。
( NEWLINE ) 現在の行を実行します。
( RETURN ) 現在の行を実行します。
現在の行が NULL の場合のみ、end-of-file 文字 ( ファイルの終わりを示す。通常は ‸D) を end-of-file として処理します。
直前のコマンドを取り出します。‸P を入力するたびに、1 つずつ逆方向に コマンドの履歴を取り出します。複数行にわたるコマンドで最初の行でない場合は、1 行戻ります。
最も古いコマンドの履歴を取り出します。
最も新しいコマンドの履歴を取り出します。
次のコマンド行を取り出します。‸N を入力するたびに、1 つずつ順方向に コマンドの履歴を取り出します。
履歴を逆上って、string が示す文字列を含むコマンドを検索します。パラメータとして 0 を指定すると、順方向に検索します。string の終わりは、復帰改行 ( RETURN または NEWLINE ) で示します。string の先頭に ‸ を付加すると、その文字列で始まっている コマンドだけが検索されます。string を省略すると、直前に指定した文字列を指定したものとして 検索します。この場合、パラメータとして 0 を指定すると検索方向が逆になります。
現在の行を実行し、現在の行に関連する次の行を 履歴ファイルから取り出します。
( エスケープ ) 数値パラメータを定義します。digits は次のコマンドに対するパラメータと見なされます。パラメータを受け付けるコマンドは、‸F、‸B、erase、‸C、‸D、‸K、‸R、‸P、‸N、‸]、M–.、M–‸]、M–_、M–b、M–c、M–d、M–f、M–h、M–l、および M–‸H です。
( ソフトキー ) ユーザーの別名リスト中で、_letter という名前の別名を検索します。その別名が定義されていると、その値が入力待ち行列に挿入されます。letter は、前述のメタ関数に用いられている文字であってはなりません。
( ソフトキー ) ユーザーの別名リスト中で、_letter という名前の別名を検索します。この名前の別名が定義されていれば、処理待ちの入力待ち行列上にその値を挿入します。この機能は、多くの端末において、ファンクションキーをプログラムするために 使用できます。
直前のコマンドの最後のワードを 行に挿入します。数値パラメータを指定すると、最後のワードではなく その数値が表すワードが挿入されます。
M–. と同じです。
アスタリスクがワードの最後に付加され、ファイル名が展開されます。
ファイル名の補完を行います。現在のワードにアスタリスクを付加したものと 一致するすべてのファイル名の最長の 前方一致部分で、現在のワードを 置き換えます。一致するものが 1 つしかない場合、ファイルがディレクトリなら / を付加し、ファイルがディレクトリでないときは空白を付加します。
現在のワードのあとにアスタリスクを付加すれば一致する ファイル名をリスト表示します。
次のコマンドの数値パラメータを 4 倍します。
次の文字をエスケープします。編集用文字、ユーザーが設定した消去文字、抹消文字、割り込み文字 ( 通常は ‸?) は、その前に \\ を指定すれば、コマンド行または検索文字列に入力できます。\\ は、次の文字の編集機能 ( もしあれば ) を無効にします。
シェルのバージョンを表示します。
# を行の先頭に挿入後、行を実行します。これによりコメントを履歴ファイルに挿入することができます。
2 つの処理モードがあります。初期状態では、コマンドを入力すると、入力モードになります。編集するときは、エスケープキー (ESC( 033)) を入力すれば制御モードになるので、訂正が必要な箇所にカーソルを移動し、必要に応じて文字やワードを挿入または削除することができます。大半の制御コマンドでは、コマンドの先頭に繰り返し数を指定できます。
多くのシステムでは、vi モードにいる時ははじめに標準処理モード ( 行入力モード ) になっています。端末の回線速度が 1200 ボー以上であり、しかも制御文字を含んでいるか、または プロンプトが表示されてから 1 秒以下の経過時間であれば、コマンドは再び表示されます。ESC 文字を入力することにより、コマンドの残りについての標準処理を終了します。このときユーザーはコマンド行を変更できます。この機構により、標準処理モードは、raw モード ( 文字入力モード ) の先行入力表示という利点を持ちます。
viraw オプションも設定すると、端末は標準処理モードを常に無効にすることができます。このモードは、行の終わりの区切りを示す代替記号を 2 つサポートしていないシステムでは暗に設定されています。ある種の端末においては便利な機能です。
デフォルトでは、エディタは入力モードになります。
( stty(1) コマンドで定義するユーザー定義消去文字、通常は ‸H または #) 直前の文字を削除します。
直前の、ブランクで区切られたワードを削除します。
シェルを終了します。
次の文字をエスケープします。編集用の文字、ユーザーの定義した消去文字または抹消文字は、その前に ‸V を入力すれば、コマンド行または検索文字列に入力できます。‸V は、次の文字の編集機能 ( もしあれば ) を無効にします。
次の erase または末消文字をエスケープします。
次のコマンドはカーソルを移動させます。
カーソルを 1 文字分右に移動します。
1 つ先の英数字のワードに カーソルを移動します。
ブランクがあとに続く次のワードの 先頭にカーソルを移動します。
カーソルを ワードの終わりに移動します。
ブランクで区切られている直前のワード の終わりにカーソルを移動します。
カーソルを 1 文字分左に移動します。
カーソルを 1 つ前のワードに移動します。
ブランクで区切られている 直前のワードにカーソルを移動します。
カーソルを count で示すカラムへ移動します。
現在の行において文字 c が次に現れる位置にカーソルを移動します。
現在の行において文字 c が前に現れる位置にカーソルを移動します。
f と h を連続して実行した場合と同じ結果です。
F と l を連続して実行した場合と同じ結果です。
直前の単一文字検索コマンドの f、F、t、または T を count の数だけ繰り返します。
直前の単一文字検索コマンドを count の数だけ逆方向に行います。
カーソルを、行の始めまで移動します。
カーソルを、行における最初のブランク以外の文字まで移動します。
カーソルを、行の終わりまで移動します。
現在の位置にある括弧記号 (、)、{、}、[、] に対応する括弧記号にカーソルを移動します。現在の文字がいずれの括弧でもない場合、現在の行を前方向に検索し、最初に現れた括弧に対応する 括弧の位置に移動します。
以下のコマンドはコマンド履歴を使用します。
直前のコマンドの履歴を取り出します。k を入力するたびに、1 つずつ逆方向に コマンドの履歴を取り出します。
k と同じです。
次のコマンドを取り出します。j を入力するたびに、1 つずつ順方向に コマンドの履歴を取り出します。
j と同じです。
count という番号のコマンドの履歴を取り出します。省略時は最も古いコマンドの履歴を取り出します。
履歴をさかのぼって、string が示す文字列を含むコマンドを検索します。string の終わりは復帰改行 ( RETURN または NEWLINE ) で示します。string の先頭に ‸ を付加すると、その文字列で始まっている コマンドだけを検索します。string が NULL の場合は、直前に指定された文字列を使用します。
/ と同じです。ただし、検索は順方向になります。
直前の / または ? コマンドで指定した文字列と 次に一致するコマンドの履歴を検索します。
直前の / または ? コマンドで指定した文字列と 次に一致するコマンドの履歴を逆方向に検索します。
以下のコマンドは行を変更します。
入力モードにして、現在の文字のあとにテキストを入力します。
行の終わりにテキストを追加します。$a と同じです。
[count]cmotion
現在の文字から motion によりカーソルが移動する先までの文字を削除し、入力モードにします。motion が c の場合、行全体を削除し入力モードにします。
現在の文字から行の終わりまでを削除し、入力モードにします。c$ と同じです。
count で指定した数の文字を削除して 入力モードにします。
cc と同じです。
現在の文字から行の終わりまでを削除します。d$ と同じです。
[count]dmotion
現在の文字から motion によりカーソルが移動する先までの文字を削除します。motion が d の場合、行全体を削除します。
入力モードにして、現在の文字の前にテキストを挿入します。
行の先頭にテキストを挿入します。0i と同じです。
カーソルの前に、直前のテキスト変更を挿入します。
カーソルのあとに、直前のテキスト変更を挿入します。
入力モードにして、スクリーン上の文字を重ね打ちした文字に 置き換えます。
現在位置から始まる count 個の文字を c に置き換え、カーソルを前進させます。
現在の文字を削除します。
カーソル直前の文字を削除します。
直前のテキスト変更コマンドを繰り返します。
現在のカーソル位置から始まる count 個の文字を、大文字の場合は小文字に、小文字の場合は大文字に変換して、カーソルを前進させます。
直前のコマンドの count 個のワードを追加し、入力モードにします。count を省略すると、最後のワードを使用します。
* を現在のワードのあとに付けたしたものと見なし、ファイル名を生成しようとします。一致するものが見つからない場合、ベルを鳴らします。見つかった場合は、ワードを一致した文字列で置換し、入力モードにします。
ファイル名の補完を行います。現在のワードにアスタリスクを付加したものと 一致するすべてのファイル名の最長前方一致部分で、現在のワードを置き換えます。一致するものが 1 つしかない場合、ファイルがディレクトリであれば / を付加し、ファイルがディレクトリでなければ 空白を付加します。
その他のコマンドを以下に説明します。
現在の文字から motion によりカーソルが移動する先までの文字を、削除用バッファに入れます。テキストとカーソルは変わりません。
現在の位置から行の終わりまでの文字をバッファに入れます。y$ と同じです。
直前のテキスト変更コマンドを取消 (undo) します。
現在の行で実行されたテキスト変更コマンドすべてを 取消 (undo) します。
fc -e ${VISUAL:-${EDITOR:–vi}} count コマンドを入力バッファに戻します。count を省略すると、現在の行を使用します。
復帰改行して現在の行を表示します。制御モードでのみ有効です。
復帰改行 (NEWLINE) 。モードと無関係に現在の行を実行します。
復帰改行 ( RETURN ) 。モードと無関係に現在の行を実行します。
コマンドの先頭文字が # であれば、その # およびそのあとの 復帰改行 ( RETURN ) に続く # を削除します。先頭文字が他の文字であれば、# を各行の先頭に挿入後、行を送ります。現在の行を注釈として履歴に挿入したり、履歴ファイル中にある以前の注釈付きコマンドから 注釈を削除したりする際に便利です。
現在のワードのあとにアスタリスクを付加すれば、一致する ファイル名をリスト表示します。
別名リストで _letter という名前の別名を検索します。この名前の別名が定義されていれば、処理待ちの入力待ち行列上にその値を挿入します。
以下の単純コマンドは、シェルプロセス中で実行されます。入出力のリダイレクトが可能です。特に断わりのないかぎり、出力はファイル記述子 1 上に書き込まれ、構文エラーがなければ終了ステータスは 0 です。1 つまたは 2 つのアスタリスク (*) が先頭に付加されているコマンドは、以下のような特殊な処理を受けます。
コマンドが完了しても、コマンドの直前の 変数代入リストは依然として有効です。
入出力のリダイレクトは変数代入後に行われます。
エラーが発生すると、それを含むスクリプトは中止されます。
変数代入形式で、** を先頭に持つコマンドに続くワードは、変数代入と同一の規則で展開されます。つまり、チルド置換は = 符号のあとに実行され、ワード分割とファイル名生成は実行されません。
パラメータの展開だけを行います。
file 全体を読み取ってからコマンドを実行します。コマンドは現在のシェル環境において実行されます。PATH で指定された検索パスを使用して、file が存在しているディレクトリを見つけます。引数の arg は ( 指定されていれば ) 定位置パラメータになります。引数を指定しないと定位置パラメータは変更されません。終了状態は、最後に実行されたコマンドの終了状態です。
引数なしの場合、このコマンドは標準出力上に name=value という形式の別名のリストを表示します。value が指定された名前に対しては別名を定義します。value の後方に空白があると、次のワードが別名置換指定かどうかをチェックします。-t フラグは、検索済みの別名を設定またはリスト表示します。検索済み別名の値は、指定した name に対応する完全パス名になります。PATH の値を再設定すると この値は未定義になりますが、別名は検索済みのままです。-t フラグを省略すると、value が指定されていない引数リスト内の各 name について、別名の名前と値を表示します。-x フラグは、エクスポートされた別名を設定または表示します。エクスポートされた別名は、名前で起動されるスクリプト用に定義されます。name が指定されているが、value は指定されておらず、name に対しての別名も定義されていない場合は、終了ステータスは ゼロ以外になります。
このコマンドが有効なのは、ジョブ制御をサポートするシステム上だけです。指定された各 job をバックグラウンドで実行します。job が省略された場合は、現在のジョブをバックグラウンドで実行します。job の記述形式についての説明は、「ジョブ」の項を参照してください。
for ループ、while ループ、until ループ、または select ループがあれば終了します。n を指定すると、n レベル分だけ ループを終了します。ループの数より n が大きい場合は、一番外側のループが終了します。
for ループ、while ループ、until ループ、または select ループの次の繰り返しを実行します。n を指定すると、n 番目のループから実行します。ループの数より n が大きい場合は、一番外側のループを実行します。
このコマンドは上記 2 つの形式の いずれかで入力します。第 1 の形式は、現在のディレクトリを arg に変更します。arg が – の場合、ディレクトリを直前のディレクトリに変更します。 シェル変数 HOME の値がデフォルトの arg になります。環境変数 PWD は、現在のディレクトリに設定されます。PWD が変更されると、環境変数 OLDPWD も 1 つ前の作業ディレクトリの値に変更されます。つまり、cd の呼び出しに対して、まず、現在の作業ディレクトリをただちに OLDPWD に設定します。CDPATH というシェル変数は、arg を含むディレクトリの検索パスを定義します。 ディレクトリ名は、コロン ( :) で区切ります。デフォルトのパスは 空の文字列です ( 現在のディレクトリの指定 ) 。なお、現在のディレクトリは 空のパス名で指定します。このパス名は、等号の直後か、パスリスト内にある区切り文字のコロンの間に指定します。 arg の先頭文字が / の場合、検索パスは使用しません。それ以外の場合は、パス中の各ディレクトリで arg を検索します。
演算子ドットドット (..) を論理的に処理します。構成要素ドットドットを処理する前に、シンボリックリンクの構成要素は解決されません。
演算子ドットドット (..) を物理的に処理します。構成要素ドットドットを処理する前に、シンボリックリンクの構成要素が解決されます。
-L オプションおよび -P オプションが両方とも指定された場合は、最後に呼び出されたオプションが使用され、もう一方は無視されます。-L オプションも -P オプションも指定されない場合は、ドットドットは論理演算子として処理されます。
cd の第 2 の形式は、PWD 中の現在のディレクトリ名における old という文字列を new という文字列に置換し、この新規のディレクトリへ変更しようとします。cd コマンドは rksh では実行できません。
command ユーティリティは、シェルに対して、シェル関数検索を抑止し 引数を単純コマンドとして扱うようにします。-p フラグは、全標準ユーティリティを検索できる PATH のデフォルト値を使って、コマンド検索を行います。-v フラグは、標準出力に文字列を書き出します。この文字列は、現在のシェル実行環境でシェルが command_name を呼び出すために使用するパス名またはコマンドを表します。-V フラグも標準出力に文字列を書き出します。この文字列は、command_name オペランドに指定された名前を、シェルが現在のシェル実行環境で どのように解釈するかを表します。
このコマンドの使用法と説明については、echo(1) を参照してください。
引数をシェルへの入力として読み取り、生成されるコマンドを実行します。
arg を指定すると、このシェルの代わりに、引数で指定されたコマンドを ( 新規プロセスは生成せずに ) 実行します。入出力引数が指定可能で、現在のプロセスに影響を及ぼす場合があります。引数を指定しない場合は、ファイル記述子が、入出力リダイレクトリストの指定どおりに 変更されることになります。この場合、この機能によりオープンされた 2 より大きい番号のファイル記述子は、別のプログラムを起動するとクローズされます。
呼び出し元のシェル、またはシェルスクリプトを n で指定した終了ステータスで終了させます。具体的には、指定した値の最下位 8 ビットが終了ステータスの値となります。n を省略すると、最後に実行されたコマンドの終了ステータス がシェルの終了ステータスになります。トラップ実行中に exit が発生した場合、ここで言う最後に実行されたコマンドとは、トラップ呼び出し直前に実行されたコマンドを指します。なお、ignoreeof オプション ( 後述の set を参照 ) が有効になっているシェルを除き、EOF を検出した場合もシェルが終了します。
指定された name に対し、あとで実行されるコマンドの環境へ 自動的にエクスポートされるようにマークを付けます。
-p を指定すると、export は、エクスポートされたすべての変数の名前と値を次の書式で標準出力に書き出します。
"export %s=%s\ ", name, value |
(name が設定されている場合)
"export %s\ ", name |
(name が設定されていない場合)
エクスポートされている変数の結果を得るコマンドとしてシェルに再入力することが適切にできるように、シェルは、引用符の適切な使用法を含めた出力の書式を設定します。 以下の場合は除きます。
値を持つ読み取り専用の変数は再設定できません。
value に、状態が保存されたときと保存された出力がシェルに再入力されたときの間の値が割り当てられる場合、出力時に設定を解除された変数は、設定解除された状態に再設定できません。
第 1 の形式は、端末から最近入力された HISTSIZE 個のコマンドの中から、first から last までの範囲のコマンドを選択します。first と last の両引数は、数値または文字列で指定できます。文字列の場合、その文字列で始まる最新のコマンドを見つけます。負の数値は、現在のコマンド番号からのオフセットとなります。-l フラグを指定すると、標準出力上にコマンドをリスト表示します。-l を指定しないと、これらのキーボードコマンドの入ったファイル上で ename というエディタプログラムを起動します。ename が省略されていると、変数 FCEDIT ( デフォルトは /bin/ed) の値をエディタとして使用します。編集が完了すると、編集されたコマンドを実行します。last を省略すると、first と同一値に設定されます。first を省略すると、デフォルトは、編集については直前のコマンドに、リスト表示については –16 になります。-r フラグはコマンドの順序を逆にします。-n フラグはリスト表示時にコマンド番号の出力を抑止します。第 2 の形式では、old=new 置換実行後に command が再実行されます。command 引数を指定しない場合、一番最後に入力したコマンドが実行されます。
このコマンドが有効なのは、ジョブ制御をサポートするシステム上だけです。指定された各 job をフォアグラウンドで実行します。job が指定されないと、現在のジョブをフォアグラウンドで実行します。job の記述形式についての説明は、「ジョブ」の項を参照してください。
arg が正当なオプションを示しているかをチェックします。arg を省略すると、定位置パラメータが使用されます。オプション引数は + または – で始まります。+ または – 以外の文字で始まっているオプション、あるいは – – 引数があると、オプションの終わりとみなされます。optstring には、getopts が認識する文字を記述します。文字のあとに : が続く場合、そのオプションには引数があるとみなされます。オプションと引数とはブランクで区切ることができます。次の arg のインデックスは OPTIND に格納されます。オプション引数がある場合は OPTARG に格納されます。optstring 内で先頭に : がある場合は、getopts は無効なオプション文字を OPTARG に格納し、name を ? ( 未定義のオプションが指定された場合 ) または : ( 必要なオプション引数が省略されている場合 ) に設定します。: が先頭にない場合には、getopts はエラーメッセージを表示します。オプションがなくなると、終了ステータスはゼロ以外になります。使用法と説明については、getoptcvt(1) を参照してください。
シェルは、name に指定されたコマンドごとに、検索パス内での位置を決定し、記憶します。-r オプションを指定すると、シェルは記憶したすべての位置を破棄します。引数をまったく指定しないと、記憶されたコマンドに関する情報が表示されます。Hits は、シェルプロセスによってコマンドが呼び出された回数を表します。Cost は、検索パスのコマンドを見つけるのに必要な作業領域です。コマンドが検索パスの「相対」ディレクトリにある場合、そのディレクトリの変更後に そのコマンドが格納された位置が再計算されます。この再計算が行われる予定のコマンドに対しては、Hits 情報の隣にアスタリスク (*) が示されます。Cost の値は、再計算が行われるたびに増加されます。
指定された各々のジョブに関する情報を一覧表示します。job 引数を省略すると、活動中のジョブすべてに関する情報を一覧表示します。-l フラグは、通常の情報に加えてプロセス ID も表示します。-n フラグは、前回通知を受けたあとに停止または終了した ジョブだけを表示します。-p フラグは、プロセスグループだけを表示します。job の記述形式についての説明は、「ジョブ」の項と jobs(1) を参照してください。
TERM ( 終了 ) シグナルまたは指定されたシグナルのいずれかを、指定されたジョブまたはプロセスに送信します。シグナルは、番号または名前 ( signal(3HEAD) の場合と同様に SIG という接頭辞を取り除いたもの。ただし、SIGCHD は CHLD という名前となる ) で指定します。送信するシグナルが TERM ( 終了 ) または HUP ( ハングアップ ) の場合、停止中のジョブまたはプロセスには CONT ( 継続 ) シグナルを送信します。job という引数は、活動中のジョブではないプロセスのプロセス ID を指定することもできます。job の記述形式についての説明は、「ジョブ」の項を参照してください。第 2 の形式の kill –l は、シグナル番号とシグナル名をリスト表示します。
各 arg は、評価の対象となる個々の算術式を表します。評価の方法については、前述の「算術的評価」の項を参照してください。終了ステータスは、最後の式の値が 0 の場合には 1 で、0 以外の場合は 0 です。
exec /bin/newgrp arg . . .. と同じです。使用法と機能説明については login(1) を参照してください。
exec /bin/newgrp arg . . . と同じです。
シェルの出力機構です。フラグを省略した場合、あるいは – または – – フラグを指定した場合には、echo(1) で述べるように標準出力上に引数を表示します。出力ファイルが書き込み用にオープンされて いない場合を除いて、終了ステータスは 0 となります。
復帰改行 ( NEWLINE ) の出力を抑止します。
( raw モード ) echo のエスケープ規則を無視します。-R オプションは、-n を除く後続の引数およびオプションすべてを表示します。
標準出力の代わりに |& で生成されたプロセスのパイプ上に引数を出力します。
標準出力の代わりに 履歴ファイル上に引数を書き込みます。
出力を格納するファイル記述子番号を、1 桁の数値 n で指定します。デフォルトは 1 です。
現在の作業ディレクトリの絶対パス名を標準出力に書き出します。パス名には、ドット (.) またはドットドット (..) は含まれません。
PWD 環境変数に、現在のディレクトリの絶対パス名 (ファイル名にドットまたはドットドットを含まない) が含まれている場合は、pwd はこのパス名を標準出力に書き出します。それ以外の場合、-L オプションは -P オプションと同様の結果を書き出します。
書き出される絶対パス名にはファイル名が含まれません。パス名のコンテキストでは、シンボリックリンク形式でファイル名が参照されます。
-L と -P の両方が指定された場合、最後に指定されたオプションが適用されます。-L も -P も指定されない場合は、pwd は -L オプションを指定した場合と同様の結果を書き出します。
シェルの入力機構です。1 つの行を読み取り、IFS が示す文字を区切り文字として使用して、行の内容をいくつかのフィールドに分割します。エスケープ文字 ( \\) は、次の文字の特別な意味または 行の継続に関する意味を取り除くために使用します。-r で指定する raw モードでは、\\ が持つこの特殊な意味は無視されます。第 1 フィールドを 1 番目の name に、第 2 フィールドを 2 番目の name に、という順番で割り当てていき、余ったフィールドがあれば最後の name に割り当てます。-p オプションは、シェルが |& を使用して生成したプロセスの入力パイプから入力行を取り出します。-s フラグは、入力をコマンドとして履歴ファイルに保存します。-u フラグは、読み取り元となるファイル記述子番号を 1 桁の数値 n で指定します。ファイル記述子は、exec という特殊コマンドでオープンできます。n のデフォルト値は 0 です。name を省略すると、REPLY の値をデフォルトとして使用します。入力ファイルが読み込み用にオープンされていない場合と EOF に到達した場合を除き、終了ステータスは 0 です。-p オプションが指定されていて EOF を検出すると、このプロセスをクリアし別のプロセスを作成可能にします。最初の引数が ? を含んでいると、シェルが対話型のとき、このワードの残りを標準エラーに対する プロンプトとして使用します。EOF に到達しないかぎり、終了ステータスは 0 です。
name に「読み取り専用」のマークを付け、これらの名前が後続の割り当てでは変更できないようにします。
-p を指定すると、readonly はすべての読み取り専用変数の名前と値を次の書式で標準出力に書き出します。
"readonly %s=%s\ ", name, value |
(name が設定されている場合)
"readonly $s\ ", name |
(name が設定されていない場合)
以下のようなシェルの実行環境で読み取り専用の属性設定の結果を得るコマンドとしてシェルに再入力することが適切にできるように、シェルは引用符の適切な使用法を含め出力を書式設定します。
出力時に設定された値を持つ変数は、読み取り専用の属性設定がありません。
出力時に設定解除される変数は、保存された出力がシェルに再入力されるときの値を持ちません。
シェル関数または . スクリプトを、n で指定された戻り値で 呼び出し側スクリプトに戻します。n で指定した値の最下位 8 ビットが戻り値となります。n を省略すると、戻り値は最後に実行された コマンドの戻り値になります。関数や . スクリプト実行中以外で return を起動すると、結果は exit と同一になります。
配列の代入。name で示される変数の設定を解除し、arg リストから順々に値を割り当てます。+A は、最初の変数設定を解除しません。
定義される後続の変数すべてを自動的にエクスポートします。
シェルに対し、バックグラウンドジョブの終了を ユーザーに非同期に通知するよう要求します。以下のメッセージが標準エラー出力に書き出されます。
"[%d]%c %s%s\ ", <job-number>, <current>, <status>, <job-name>
個々のフィールドの意味は次のとおりです。
文字 + は、fg または bg ユーティリティ用のデフォルトとして用いるジョブを表します。このジョブは、job_id %+ または %% を使って指定することもできます。文字 – は、現在のデフォルトジョブが終了したときに デフォルトとなるジョブを表します。このジョブは、job_id %– を使って指定することもできます。その他のジョブには、このフィールドは空白文字となります。+ が識別できるジョブは最大 1 つで、– が識別できるジョブも最大 1 つです。中断中のジョブがあると、現在のジョブも中断中となります。複数のジョブが中断中だと、1 つ前のジョブも中断中になります。
wait、fg、bg、kill の各ユーティリティ用にプロセスグループを識別するのに用いる番号です。これらのユーティリティを使用する際、ジョブ番号の先頭に % を付加してジョブを識別できます。
未定義です。
未定義です。
シェルがジョブの終了をユーザーに伝えるとき、そのジョブのプロセス ID を現在のシェル実行環境内のリストから削除することがあります。非同期の通知をデフォルトにすることはできません。
シェルのリダイレクト演算子 > によって既存のファイルが上書きされないようにします。リダイレクト演算子 >| は、個々のファイルに対し、noclobber オプションに優先して有効となります。
コマンドの終了ステータスが 0 でない場合、ERR トラップ ( 設定されていれば ) を実行し、終了します。このモードは、プロファイル読み取り時は無効です。
ファイル名の生成を無効にします。
各コマンドは、最初に検出された時点で、検索済み別名になります。
コマンド名に先行するものだけでなく、すべての変数代入引数をコマンドの環境に格納します。
バックグラウンドジョブを個別のプロセスグループで実行し、完了時にメッセージを 1 行表示します。バックグラウンドジョブの終了ステータスは 完了メッセージで報告されます。ジョブ制御を備えたシステムでは、このフラグは 対話型シェルに対して自動的に有効になります。
コマンドを読み取り、構文エラーがないかチェックします。実行は行いません。対話型シェルに対しては無視されます。
このフラグのあとに指定する引数は、以下のオプション名のいずれかです。
-a と同じです。
-e と同じです。
バックグラウンドジョブをすべて低い優先度で実行します。これはデフォルトモードです。
コマンド入力用に、emacs 形式のインラインエディタを起動します。
コマンド入力用に、gmacs 形式のインラインエディタを起動します。
EOF を検出してもシェルは終了しません。終了させるには exit コマンドを使用する必要があります。
-k と同じです。
ファイル名生成によって生成されるディレクトリ名には、すべて最後に / を付加します。
-m と同じです。
> によるリダイレクトが存在するファイルを切り捨てないようにします。このオプションが有効なとき、ファイルを切り捨てるには >| 指定が必要です。このオプションは -C と同等です。
-n と同じです。
-f と同じです。
履歴ファイルに関数定義を保存しません。
-b と同等です。
-u と同じです。
-p と同じです。
-v と同じです。
-h と同じです。
vi 形式のインラインエディタの挿入モードになります。033 というエスケープ文字を押すと、挿入モードから制御モードに変わります。リターンキーで行を送信します。
各文字を vi モードで入力されたときと同様に処理します。
-x と同じです。
オプション名を指定しない場合、-o は現在のオプション設定を表示します。
$HOME/.profile ファイルを処理しないようにし、ENV ファイルの代わりに /etc/suid_profile ファイルを使用します。このモードは、実効ユーザー ID が実ユーザー ID と等しくないとき、また実効グループ ID が実グループ ID と等しくないときには 必ず有効になります。このモードを無効にすると、実効ユーザー ID が実ユーザー ID に、実効グループ ID が実グループ ID にそれぞれ設定されます。
定位置パラメータを辞書編集方式の順にソートします。
コマンド 1 つを読み取って実行し、終了します。
置換を行う際に、設定されていないパラメータをエラーとして扱います。
シェルへの入力行を読み取り時に表示します。
コマンドとその引数を実行時に表示します。
-x フラグと -v フラグを無効にし、フラグに対する引数の検査を停止します。
どのフラグも変更しません。このフラグは、$1 を – で始まる値に設定する際に便利です。このフラグのあとに引数がない場合、定位置パラメータが設定解除されます。
– の代わりに + を使用すると、これらのフラグが無効になります。これらのフラグはシェル起動時にも使用できます。現在設定されているフラグは、$– で見ることができます。-A を指定しないかぎり、残りの引数は定位置パラメータとなり、$1 $2 . . . に順番に割り当てられます。引数を 1 つも指定しない場合には、すべての変数の名前と値を標準出力上に表示します。
$n+1 . . . の定位置パラメータを $1 . . . という名前に変更します。n のデフォルト値は 1 です。n に指定できる値は、評価結果が $# 以下の負でない数になる算術式です。
stop は、jobid ( ジョブ ID 番号 ) を指定して バックグラウンドジョブの実行を中断、または pid ( プロセス ID 番号 ) を指定して すべてのプロセスを中断します ( ps(1)参照 ) 。
現在のシェルがログインシェルでない場合、その実行を中断します。
条件式を評価します。使用法と機能説明については 前述の「条件式」の項と test(1) を参照してください。
シェルおよびシェルから実行されたプロセスの、ユーザー時間およびシステム時間の累計値を表示します。
arg は、sig が示すシグナルをシェルが受信したときに読み取られ、実行されるコマンドです。arg は、トラップ設定時と トラップ取り出し時に 1 度ずつ検索されます。sig は、シグナル番号またはシグナル名を指定します。trap コマンドは、シグナル番号の順序で実行されます。現在のシェルで無視されているシグナル番号にトラップを 設定しようとしても無効となります。arg が – の場合、シェルは各 sig デフォルト値を再設定します。arg が NULL 文字列の場合、シェルは指定された各 sig が発生してもそれを無視します。ただし 対応する sig が 1 つでも発生した場合、arg はシェルにより実行されます。トラップのアクションは、以前のアクション ( デフォルトまたは明示的に設定されたもの ) より優先して用いられます。トラップのアクション完了後、$? の値はトラップが呼び出されたときの値となります。
sig は EXIT または 0 (EXIT と同義 ) 、またはシンボル名を使って指定したシグナルから接頭辞 SIG を除いたものです。たとえば HUP、INT、QUIT、TERM などです。sig が 0 または EXIT で、trap 文がある関数内部で実行された場合、関数終了後に arg の示すコマンドが実行されます。sig が 0 または EXIT で、トラップが関数の外側で設定されている場合、シェルの終了時に arg の示すコマンドが実行されます。sig が ERR の場合、コマンドが ゼロ以外の終了ステータスで終わると必ず arg が実行されます。sig が DEBUG の場合、各コマンドのあとに arg が実行されます。
シェルが EXIT に対してトラップを実行する環境は、EXIT のトラップを得る以前に実行された最後の コマンドの直後の環境と同じです。
トラップが呼び出されるたびに、arg 引数は以下のものと同じように処理されます。
eval "$arg"
非対話型シェルの開始時に無視されたシグナルは、トラップもリセットもできません。ただしトラップやリセットを 試みても、エラーは報告されません。対話型のシェルは、呼び出し時に無視されたシグナルを リセットしたりキャッチしたりできます。トラップは、そのシェルの動作中は、他の trap コマンドにより明示的に変更されないかぎり、有効であり続けます。
サブシェルを立ち上げたときは、トラップはデフォルトに設定されます。ただしこれは、サブシェル内では コマンドを使って新たなトラップを設定できない、ということではありません。
引数なしの trap コマンドは、各シグナルに対応したコマンドの一覧を標準出力に書き出します。その形式は次のとおりです。
trap -- %s %s . . . <arg>, <sig> . . . |
シェルは、この出力の形式 ( 引用符の使用法も含む ) を直し、同様のトラップ結果をもたらすようなコマンドとしてシェルに再入力できる形式にします。次の例を見てください。
save_traps=$(trap) . . . eval "$save_traps" |
トラップの名前や番号が正しくないと、ゼロ以外の終了ステータスが 返されます。正しければ 0 が返されます。対話型のシェルも非対話型のシェルも、シグナル名やシグナル番号が誤りでも構文エラーとはならず、シェルも異常終了しません。
ジョブがフォアグラウンドプロセスを待っている間は、トラップは処理されません。このため CHLD に対するトラップは、フォアグラウンドジョブが終了するまで実行されません。
name をコマンド名として使用した場合に どのように解釈されるかを表示します。
シェル変数と関数の属性と値を設定します。関数内で typeset を実行すると、name が示す変数の新しいインスタンスが生成されます。関数が完了すると、その変数の値と型が復元されます。このコマンドには、以下の属性を指定できます。
このフラグは UNIX 以外のマシン上で、UNIX とホスト名ファイルとのマッピング情報を提供します。
左詰めを行い、先行するブランクを value から取り除きます。n は、ゼロ以外であればフィールドの幅を定義します。0 の場合、フィールドの幅は最初に代入される値の幅で決定されます。変数に値を代入したとき、フィールド幅より短ければ右側にブランクが詰められ、長ければ切り捨てられます。-Z フラグも指定されていれば、先行する 0 を削除します。-R フラグは無効になります。
右詰めを行い、先行するブランクを挿入します。n は、ゼロ以外であればフィールドの幅を定義します。0 の場合、フィールドの幅は最初に代入される値の幅で決定されます。変数に値を代入したとき、フィールド幅より短ければ左側にブランクが詰められ、長ければ終端が切り捨てられます。-L フラグは無効になります。
最初の、ブランクでない文字が数字で、さらに -L フラグが設定されていない場合、右詰めを行い先頭に 0 を詰めます。n は、ゼロ以外であればフィールドの幅を定義します。0 の場合、フィールドの幅は最初に代入される値の幅で決定されます。
名前は、変数名ではなく関数名を指します。代入は行われません。このフラグと共に指定できる他のフラグは、-t、-u、-x だけです。-t フラグは、この関数の実行トレースを有効にします。-u フラグは、この関数に「未定義」を示すマークを付けます。関数が参照されると、関数定義を見つけるために FPATH 変数が検索されます。-x フラグを指定すると、名前で呼び出されるシェル手続き全体で関数定義が有効になります。
パラメータを整数とします。これにより算術演算が高速化されます。n は、ゼロ以外であればその値を底として定義します。0 の場合、最初の代入で底が決定されます。
大文字をすべて小文字に変換します。大文字への変換を示す -u フラグを無効にします。
指定された name を読み取り専用にします。あとの代入でこれらの名前を変更できないようにします。
変数にタグを付けます。タグはユーザーが定義可能で、シェルに対して特別の意味を持ちません。
小文字をすべて大文字に変換します。小文字への変換を示す -l フラグを無効にします。
指定された name に対し、あとで実行されるコマンドの環境へ 自動的にエクスポートされるようにマークを付けます。
-i 属性は、-R、-L、-Z、-f と同時に指定することはできません。
– の代わりに + を使用すると、これらのフラグは無効になります。name 引数をまったく指定せずにフラグを指定すると、これらのフラグが設定されている変数の名前 ( および選択により値も ) が一覧表示されます。具体的には – を付加すれば名前と値が、+ を付加すれば名前だけが表示されます。name 引数とフラグを 1 つも指定しないと、すべての変数の名前と属性が表示されます。
資源の制限を表示または設定します。使用可能な資源の制限は以下に説明します。システムによっては、以下に挙げたすべての 資源の制限を提供していないこともあります。limit 引数を指定すると、制限値が設定されます。limit の値は、各資源に対応した単位 ( 後述 ) の数値、または unlimited という文字列です。H と S の両フラグは、資源に対して 強い制限と弱い制限のどちらを 設定するかを表します。強い制限値は、いったん設定したら あとで増加させることはできません。弱い制限値は、強い制限値を超えない範囲で 増加させることが可能です。H も S も省略すると、指定した制限値が強い制限と弱い制限の 両方に適用されます。limit 引数を省略すると、現在の資源制限値が表示されます。このとき、H が指定された場合を除き、表示されるのは弱い制限値です。複数の資源を指定すると、値の前に制限する資源名と単位とが表示されます。
現在の資源制限値をすべて表示します。
コアダンプ時の コアファイルのサイズをブロック (512 バイト) 単位で表します。
データ領域のサイズを K バイト単位で表します。
子プロセスが書き込むファイルのサイズをブロック (512 バイト) 単位で表します。読み込むファイルにはサイズの制限はありません。
最大ファイル記述子に 1 を加えた値を表します。
スタック領域のサイズを K バイト単位で表します。
各プロセスが使用する秒数を表します。
仮想記憶のサイズを K バイト単位で表します。
オプションをすべて省略すると、-f が指定されたものとみなします。
ユーザーファイルの作成時のマスクを mask 引数が示す値に設定します ( umask(2) を参照 )。mask には、chmod(1) で説明する記号値または 8 進数を指定できます。記号値を指定すると、新しい umask 値は、mask を直前の umask 値の補数に適用した結果の補数になります。mask 引数を省略すると、マスクの現在の値を表示します。-S フラグは、シンボリック形式の出力を生成します。
name が示す別名を別名リストから削除します。-a オプションは、現在の実行環境からすべての別名定義を削除します。
name が示す変数の設定を解除します。つまり、それらの変数の値と属性を消去します。読み取り専用の変数は設定を解除できません。-f フラグが指定されていると、name 引数は関数名を表します。ERRNO、LINENO、MAILCHECK、OPTARG、OPTIND、RANDOM、SECONDS、TMOUT、および _ の設定を解除すると、これらの変数の特殊な意味が削除されます。あとでこれらの変数に値を代入しても、特殊な意味は持ちません。
job 引数で指定されたジョブの終了を待ち、その終了ステータスを報告します。job を指定しないと、現在実行中の子プロセスすべてを待ちます。待つ対象のプロセスの終了ステータスが、このコマンドの終了ステータスになります。job の記述形式についての説明は、「ジョブ」の項を参照してください。
指定された各 name について、それをコマンド名として使用した場合 どのように解釈されるかを示します。
-v フラグは、より詳細に表示します。
-p フラグは、name が別名、関数名、予約語の場合でも、それに対するパス検索を行います。
シェルを exec(2) で呼び出し、0 番目の引数 ( $0) の最初の文字が – である場合、シェルをログインシェルとみなし、/etc/profile からコマンドを読み取り、次に、現在のディレクトリ内に .profile が存在するか、または $HOME/.profile がある場合、そのいずれかのファイルからコマンドを読み取ります。次に、環境変数 ENV に設定されている値をパラメータ置換することによって 指定されるファイルが存在すれば、そのファイルからコマンドを読み取ります。-s フラグが省略され、arg 引数が指定されている場合、最初の arg に対してパス検索を実行し、実行すべきスクリプトの名前を判別します。arg が示すスクリプトには読み取り権が必要で、setuid 設定と setgid 設定は無視されます。パス上でスクリプトが見つからない場合は、arg は組み込みコマンドまたは組み込み関数の名前を示しているものとして処理されます。次にコマンドは後述する方法で読み取られます。以下のフラグは、起動時にシェルによって解釈されます。
このフラグが指定されると、command_string からコマンドを読み取ります。特殊パラメータ 0 の値は、command_name オペランドの値と残りの arg オペランドにある定位置パラメータ ($1、$2 など) から設定 されます。標準入力から読み取られるコマンドはありません。
このフラグが指定された場合または引数が残っていない場合、標準入力からコマンドを読み取ります。前述の特殊コマンドの出力を除くシェル出力は、ファイル記述子 2 に書き出されます。
このフラグが指定された場合または シェル入出力が端末に接続されている場合 (ioctl(2) で説明 ) 、このシェルは対話型となります。この場合、kill 0 が対話型シェルを終了しないように TERM を無視し、wait が割り込み可能になるように INTR を捕えて 無視します。いずれの場合も、シェルは QUIT を無視します。
このフラグを指定すると、シェルは制限付きシェルになります。
他のフラグと引数については、前述の set コマンドの箇所で説明されています。
rksh が設定するログイン名と実行環境の機能は、標準シェルの機能よりも制限を受けることになります。rksh の機能は、以下の動作ができない点を除き ksh と同じです。
ディレクトリの変更 ( cd(1) を参照 )
SHELL、ENV、または PATH の値の設定
/ を含むパス名またはコマンド名の指定
出力のリダイレクト ( >、>|、<>、>>)
グループの変更 ( newgrp(1) を参照 )
これらの制限は、.profile ファイルと ENV ファイルの解釈後に有効となります。
実行すべきコマンドがシェル手続きであることがわかると、rksh は ksh を起動し実行します。したがって一般ユーザーに対して、限られたコマンドのメニューを提供しながら、標準シェルの全機能を利用するシェル手続きを提供することが可能になります。この機構は、一般ユーザーが 同じディレクトリへの書き込み権と 実行権の両方を持ってはいないことを前提としています。
つまり、.profile の作者が、確実な設定処理を実行し ユーザーを適切なディレクトリ ( おそらく、ログインディレクトリではない ) に置くことにより、ユーザーの動作を完全に制御できるという点が、これらの規則の実際の効果となります。
システム管理者は、rksh で安全に起動できるコマンドのディレクトリ ( つまり /usr/rbin) を設定することがよくあります。
構文エラーなどのエラーを検出すると、シェルは ゼロ以外の終了ステータスを返します。エラーがなければ、シェルは、最後に実行されたコマンドの終了ステータスを返します ( 前述の exit コマンドの説明を参照 ) 。シェルを非対話型で使用している場合、シェルファイルの実行は中止されます。シェルが検出する実行時エラーは、コマンド名と関数名、およびエラー状態を表示することにより報告されます。エラーが発生した行の番号が 1 より大きい場合、コマンド名または関数名のあとに角括弧 ( []) で囲んで行番号も表示します。
非対話型のシェルの場合、特殊組み込みユーティリティや他の種類のユーティリティがエラー状態を検出すると、シェルは診断メッセージを書き出し、以下の表に示すように終了します。
特殊組み込み | ||
エラー | ユーティリティ | 他のユーティリティ |
シェル言語の構文エラー | 終了する | 終了する |
ユーティリティの構文エラー | ||
(オプションまたはオペランド) | 終了する | 終了しない |
リダイレクトのエラー | 終了する | 終了しない |
変数割当のエラー | 終了する | 終了しない |
展開エラー | 終了する | 終了する |
コマンドが見つからない | 該当せず | 終了の場合あり |
ドットスクリプトが見つからない | 終了する | 該当せず |
展開エラーとは、シェルの展開時に発生するものです ( たとえば ${x!y} のようなとき ! は演算子として正しくないのでエラー ) 。ただし実装によっては、これらのエラーを展開時ではなく トークン化時に検出できるのであれば、構文エラーとして 扱うことも可能です。
上記の表で「終了する」 ( または「終了の場合あり」 ) と示されているエラーが サブシェル内で発生した場合、サブシェル自身はゼロ以外のステータス で終了します ( または終了する場合があります ) が、サブシェルを含んでいるスクリプト自体は終了しません。
上記の表のすべての場合において、対話型のシェルは、診断メッセージを標準エラー出力に書き出すだけで終了はしません。
ファイルが 2 ギガバイト ( 231 バイト) 以上ある場合の ksh と rksh の動作については、largefile(5) を参照してください。
各コマンドには、他のシェルコマンドの動作に影響を与える可能性のある 終了ステータスが定義されています。ユーティリティを除く コマンドの終了ステータスは、本項内で説明します。また標準ユーティリティの終了ステータスは、それぞれの 対応する項で説明されています。
コマンドが見つからない場合、終了ステータスは 127 となります。コマンド名は見つかったが実行可能なユーティリティでは ない場合、終了ステータスは 126 となります。シェルを使わないでユーティリティを呼び出すアプリケーションは、これらの終了ステータスコードを使って同様なエラーを 報告してください。
ワードの展開中またはリダイレクト中にコマンドが失敗すると、その終了ステータスはゼロより大きい値となります。
特殊パラメータ ? 付きの終了ステータスを報告する際、シェルは得られた終了ステータスの 8 ビットすべてを報告します。シグナルを受け取ったために終了したコマンドの終了ステータスは、128 より大きな値となります。
/etc/profile
/etc/suid_profile
$HOME/.profile
/tmp/sh*
/dev/null
次の属性については attributes(5) のマニュアルページを参照してください。
cat(1), cd(1), chmod(1), cut(1), echo(1), env(1), getoptcvt(1), jobs(1), login(1), newgrp(1), paste(1), ps(1), shell_builtins(1), stty(1), test(1), vi(1), dup(2), exec(2), fork(2), ioctl(2), lseek(2), pipe(2), ulimit(2), umask(2), wait(2), rand(3C), signal(3C), a.out(4), profile(4), attributes(5), environ(5), largefile(5), signal.h(3HEAD), XPG4(5)
Morris I. Bolsky and David G. Korn, The KornShell Command and Programming Language, Prentice Hall, 1989
シェルスクリプトを setuid して使用することは避けてください。
検索済み別名であるコマンドを実行し、そのあとで同一名のコマンドが、検索パスにおいて元のコマンドがあるディレクトリの前のディレクトリにインストールされた場合、シェルは元のコマンドの方を実行します。新しい方のコマンドを実行させたければ、alias コマンドの -t オプションを使用してください。
きわめて古いシェルスクリプトには、パイプ文字として | の他に ‸ を許すものもあります。
複合コマンド内で fc 組み込みコマンドを使用すると、履歴ファイルからコマンド全体が消えます。
. file という組み込みコマンドは、いずれのコマンドを実行する場合でもその前に必ずファイル全体を読み取ります。したがって、ファイル内の alias コマンドと unalias コマンドは、ファイル内に定義されたどの関数にも適用されません。
存在しないコマンドのインタプリタを実行しようとするシェルスクリプトを、シェルが処理した場合、シェルは、シェルスクリプトが存在しないという間違った診断メッセージを返します。
名前 | 形式 | 機能説明 | エラー | 使用法 | 終了ステータス | ファイル | 属性 | 関連項目 | 警告 | 注意事項