マニュアルページセク ション 1: ユーザーコマンド

印刷ビューの終了

更新: 2014 年 7 月
 
 

rksh88(1)

名前

ksh88 , rksh88 - Korn シェル。標準/制限付きコマンドとプログラミング言語

形式

/usr/sunos/bin/ksh [± abCefhikmnoprstuvx] [± o option]... 
     [arg]...
/usr/sunos/bin/ksh -c [± abCefhikmnoprstuvx] 
     [± o option]... command_string 
     [command_name [arg...]]
/usr/xpg4/bin/sh [± abCefhikmnoprstuvx] 
     [± o option]... [arg]...
/usr/xpg4/bin/sh -c [± abCefhikmnoprstuvx] 
     [± o option]... command_string 
     [command_name [arg...]]
/usr/sunos/bin/rksh [± abCefhikmnoprstuvx] [± o option]... 
     [arg]...
/usr/sunos/bin/rksh -c [± abCefhikmnoprstuvx] 
     [± o option]... command_string 
     [command_name [arg...]]

説明

/usr/xpg4/bin/sh ユーティリティーは標準に準拠したシェルです。このユーティリティーは /usr/sunos/bin/ksh のすべての機能を提供します。ただし、動作が異なる場合を除きます。詳細については、「算術展開」節を参照してください。

/usr/sunos/bin/ksh は、端末またはファイルから読み取られたコマンドを実行するコマンドプログラミング言語です。rksh は、コマンドインタプリタである ksh の制限付きバージョンです。標準シェルよりも機能が制限されたログイン名や実行環境を設定するために使用します。シェルへの引数の意味については、「呼び出し」節を参照してください。

定義

メタキャラクタには、次のような文字があります。

; & ( ) | < > 復帰改行文字、スペース、タブ

ブランク (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 の場合にだけ後続のリストを実行します。反対に ( | |) は、戻り値が 0 以外の場合にだけ後続のリストを実行します。コマンドの区切りとして、セミコロンの代わりに任意の数の復帰改行を list に指定できます。

コマンド (command) は、単純コマンドまたは次のいずれかです。特に断わりのない限り、コマンドが返す値は、そのコマンド中で最後に実行された単純コマンドの値です。

for identifier [ in word ... ] ; do list ; done

for コマンドが実行されるたびに、identifierin word リストから次に得られる word に設定されます。in word ... を省略すると、for コマンドは設定された各定位置パラメータに対して do list を 1 回実行します。「パラメータ置換」を参照してください。リストの word がなくなると、実行は終了します。

select identifier [ in word ... ] ; do list ; done

select コマンドは、標準エラー (ファイル記述子 2) に、一群のワードをそれぞれの前に番号を付けて出力します。in word ... を省略すると、定位置パラメータが使用されます。「パラメータ置換」を参照してください。PS3 プロンプトが出力され、標準入力から行が読み取られます。この行が、リストに示された word のいずれかの番号からなる場合、identifier が示す変数の値はこの番号に該当する word に設定されます。この行が空の場合は、再度選択リストを出力します。空でない場合は、identifier 変数の値を NULL に設定します (NULL については「ブランクの解釈」を参照)。標準入力から読み取られた行の内容は、REPLY というシェル変数に保存されます。break またはファイルの終わり (EOF) に行き当たるまで、選択が発生するたびに list が実行されます。list の実行によって REPLY 変数が NULL に設定されると、次の選択を求める PS3 プロンプトの表示前に選択リストが出力されます。

case word in [ pattern [ | pattern ] ) list ;; ] ... esac

case コマンドは、word に一致する最初の pattern に対応した list を実行します。pattern の形式は、ファイル名生成に使用される形式と同じです。「ファイル名の生成」を参照してください。

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 listthen list も実行しない場合、if コマンドは 0 の終了ステータスを返します。

while list ; do list ; done
until list ; do list ; done

while コマンドは、while list を繰り返し実行し、list 中の最後のコマンドの終了ステータスが 0 の場合、do list を実行します。それ以外の場合、ループは終了します。do list 中のコマンドを実行しない場合、while コマンドは 0 の終了ステータスを返します。ループ終了条件の判定を逆にするには、while の代わりに until を使用します。

(list)

別の環境で list を実行します。入れ子で 2 つの開いた括弧を連続して記述する場合、算術評価を避けるためにスペースを挿入する必要があります。

{list}

単に list を実行します。メタキャラクタの () とは異なり、{} は「予約語」なので、認識されるためには行の始めまたは ; のあとに現れる必要があります。

[[expression]]

expression を評価し、expression が真のときに 0 の終了ステータスを返します。expression については、「条件式」を参照してください。

function identifier { list ;}
identifier( ) { list ;}

identifier で参照される関数を定義します。{} の間のコマンド群 (list) が関数の本体になります。「関数」を参照してください。

time pipeline

pipeline を実行し、標準エラーに経過時間、ユーザー時間、およびシステム時間を出力します。

次の予約語は、コマンドの最初に現れたとき、および引用符を付けずに記述されたときに認識されます。


!          if       then     else    elif    fi      case
esac       for      while    until   do      done    {   }
function   select   time     [[  ]]

Comments

# でワードを始めると、そのワードおよび以降の復帰改行までの文字がすべて無視されます。

別名

各コマンドの最初のワードに別名が定義されている場合、そのワードは別名のテキストに置き換えられます。別名は任意の数の文字で構成されます。別名に使用できない文字は、メタキャラクタ、引用符、ファイル展開文字、パラメータ置換文字、コマンド置換文字、および = です。代入する文字列としては、前述のメタキャラクタを含む有効なシェルスクリプトを指定できます。置換されたテキスト内にある各コマンドの最初のワードは、置換対象のものを除き、別名についてチェックされます。別名の最後の文字がブランクの場合、別名のあとのワードも別名置換についてチェックされます。別名を使用して、特殊組み込み型コマンドを再定義できますが、前述の予約語は再定義できません。別名は alias コマンドで作成、表示、エクスポートし、unalias コマンドで削除します。エクスポートされた別名は、名前指定で起動されたスクリプトに対しても有効ですが、シェルを起動するたびに初期化し直す必要があります。「呼び出し」を参照してください。再帰的に別名化する際に無限ループの発生を防ぐため、シェルが現在同じ名前の別名を処理中でなければ、ワードは別名の値に置換されますが、処理中であれば置換されません。

別名化はスクリプトの読み取り時に実行されますが、スクリプトの実行中には行われません。したがって別名を有効にするには、別名を参照するコマンドの読み取り前に alias コマンドで別名を定義しておく必要があります。

別名は、完全パス名の省略形としてよく使用されます。別名化機能のオプションを使って、別名の値を、該当するコマンドの完全パス名に自動的に設定できます。これらの別名を検索済み (tracked) 別名と呼びます。検索済み別名の値は、対応するコマンドを最初に検索するときに定義され、PATH 変数を再設定するたびに未定義になります。これらの別名は検索済みのままとなり、次回の参照時に値が再定義されます。複数の検索済み別名がシェル中にコンパイルされます。set コマンドの –h オプションは、参照された各コマンド名を検索済み別名にします。

次に示す「エクスポート済み別名」はシェルにコンパイルされ組み込まれますが、設定解除または再定義が可能です。



autoload='typeset −fu'
functions='typeset −f'
history='fc −l'
integer='typeset −i'
nohup='nohup '
r='fc −e −'

後方のブランク文字と予約語に関する例を示します。ユーザーが次のように入力したとします。

$ alias foo="/bin/ls "
$ alias while="/"

ここで次のコマンドを実行します。

$ while true
> do
> echo "Hello, World"
> done

この結果、Hello, World という文字列が画面上に無限に表示されます。一方、次のように入力したとします。

$ foo while

この結果は /ls 出力となります。foo に対する別名置換はスペース文字で終わりとなるため、次のワードが別名置換用にチェックされます。次のワード while も別名化されているので、置換が行われます。while は、コマンド名として正しい位置にないため、予約語として認識されません。

ユーザーが次のように入力したとします。

$ foo; while

この場合、while は通常どおり予約語とみなされます。

チルド置換

別名置換を実行すると、各ワードが引用符なしの ~ で始まっているかどうかがチェックされます。結果が真なら、/ までのワードがユーザー名と一致するかどうかがチェックされます。一致した場合は、~ および一致したログイン名が一致したユーザーのログインディレクトリに置き換えられます。これをチルド (tilde) 置換と呼びます。一致するユーザー名が見つからない場合、元のテキストは変更されません。~ が単独で指定された場合や、後ろに / を伴って指定された場合は、$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 番目の古い形式では、コマンドの実行前に、引用符間の文字列に含まれる特殊引用符文字が処理されます。「クォート」を参照してください。$(cat 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))

この式は、二重引用符で囲んだ場合と同じように扱われます。ただし、式の内部の二重引用符は特別な意味を持つとはみなされません。シェルは、パラメータ展開、コマンド置換、および引用符削除のために、式の中のトークンをすべて展開します。

次に、シェルはこの式を算術式とみなし、式の値に置き換えます。算術式は、次の例外を除いて、ISO C の規則に従って処理されます。

  • 整数の算術だけが必須です。

  • sizeof() 演算子、および先頭と末尾の ++ 演算子と − − 演算子は必須ではありません。

  • 選択、繰り返し、ジャンプの各ステートメントはサポートされていません。

  • /usr/sunos/bin/ksh および /usr/sunos/bin/rksh は、先頭の 0 から 9 までを 10 進定数として扱います。次に例を示します。

    コマンド
    /bin/ksh の結果
    /usr/xpg4/bin/sh の結果
    echo $((010+10))
    20
    18
    echo $((019+10))
    29
    エラー
    [ 10 —le $((011)) ]
    true
    false

拡張機能として、シェルはこれら以外の算術式も認識できます。式が無効な場合、展開は失敗し、シェルは失敗を示すメッセージを標準エラー出力に書き出します。

算術展開を行う簡単な例を次に示します。

# 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 をカットし、その両者をペーストし、その結果を process1process2 に送り、さらに標準出力に書き出します。このファイルは、引数としてコマンドに渡されますが、UNIX の pipe(2) になっているので、ファイル上で lseek(2) を行おうとするプログラムは動作しません。

パラメータ置換

パラメータ (parameter) は、識別子 (identifier)、1 つまたは複数の数字、または *@#?$! の文字のいずれかです。変数 (variable) は識別子が示すパラメータで、1 つの値 (value) といくつかの属性 (attribute) を持っています。属性がない場合もあります。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:−word}

デフォルト値の使用。parameter が未設定または NULL の場合は、word の展開に置換されます。それ以外の場合は parameter の値に置換されます。

${parameter:=word}

デフォルト値の割り当て。 parameter が未設定または NULL の場合は、word の展開が parameter に割り当てられます。どのような場合でも、parameter の最終的な値に置換されます。この割り当て方法は変数だけに使用可能で、定位置パラメータや特殊パラメータには使用できません。

${parameter:?[word]}

NULL または未設定のときエラー表示。parameter が未設定または NULL の場合、word の展開 (または word 省略時は未設定を表すメッセージ) が標準エラーに書き出され、シェルはゼロ以外の終了ステータスで終了します。それ以外の場合は parameter の値に置換されます。対話型シェルでは終了しません。

${parameter:+[word]}

代替値の使用。parameter が未設定または NULL の場合、NULL に置換されます。それ以外の場合は word の展開結果に置換されます。

前述のパラメータ展開では、形式内にコロンを指定すると、パラメータが未設定または NULL かどうかのテストになります。コロンを省略すると、パラメータが未設定かどうかだけのテストになります。次の 2 つの表は、コロンの効果についてまとめたものです。

パラメータが NULL 以外に設定された場合
パラメータが NULL に設定された場合
${parameter:-word}
parameter に置換
word に置換
${parameterword}
parameter に置換
NULL に置換
${parameter:=word}
parameter に置換
word を代入
${parameter=word}
parameter に置換
parameter に置換
${parameter:?word}
parameter に置換
エラー、終了
${parameter?word}
parameter に置換
NULL に置換
${parameter:+word}
word に置換
NULL に置換
${parameter+word}
word に置換
word に置換
パラメータが未設定の場合
${parameter:-word}
word に置換
${parameterword}
word に置換
${parameter:=word}
word を代入
${parameter=word}
NULL を代入
${parameter:?word}
エラー、終了
${parameter?word}
エラー、終了
${parameter:+word}
NULL に置換
${parameter+word}
NULL に置換

「...に置換」は、式が表に示した値に置き換えられることを表します。「...を代入」は、parameter にその値が代入され、さらに式が置き換えられることを表します。

${#parameter}

「文字列の長さ」。パラメータの値の長さを文字単位で示します。parameter* または @ のときは、$1 から始まるすべての定位置パラメータ (フィールド区切り文字で区切られている) に置き換えられます。

次に示す 4 種類のパラメータ展開は、部分文字列を処理するためのものです。どの場合も、パターンの評価には正規表現ではなくパターンマッチングの表記 (patmat を参照) が使われます。parameter* または @ のときは、$1 から始まるすべての定位置パラメータ (フィールド区切り文字で区切られている) に置き換えられます。完全パラメータ展開文字列を二重引用符で囲んでも、次の 4 種類のパターン文字列は引用符付きになりません。ただし、中括弧の内部で文字列を囲んだ場合は、引用符付きになります。

${parameter%word}

最小の接尾辞パターンの削除。word が展開されてパターンを生成します。その後、parameter に対してパラメータ展開が行われ、接尾辞中の pattern と一致する最小部分が削除されます。

${parameter%%word}

最大の接尾辞パターンの削除。word が展開されてパターンを生成します。その後、parameter に対してパラメータ展開が行われ、接尾辞中の pattern と一致する最大部分が削除されます。

${parameter#word}

最小の接頭辞パターンの削除。word が展開されてパターンを生成します。その後、parameter に対してパラメータ展開が行われ、接頭辞中の pattern と一致する最小部分が削除されます。

${parameter##word}

最大の接頭辞パターンの削除。word が展開されてパターンを生成します。その後、parameter に対してパラメータ展開が行われ、接頭辞中の pattern と一致する最大部分が削除されます。

:

${parameter:−word}

次の例では、x が NULL または未設定の場合にのみ ls が実行されます。$(ls) コマンド置換の表記については、前述の「コマンド置換」で説明しています。

${x:-$(ls)}

${parameter:=word}

unset X
echo ${X:=abc}
abc

${parameter:?word}

unset posix
echo ${posix:?}
sh: posix: parameter null or not set

${parameter:+word}

set a b c
echo ${3:+posix}
posix

${#parameter}

HOME=/usr/posix
echo ${#HOME} 
10

${parameter%word}

x=file.c
echo ${x%.c}.o
file.o

${parameter%%word}

x=posix/src/std
echo ${x%%/*}
posix

${parameter#word}

x=$HOME/src/cmd
echo ${x#$HOME}
/src/cmd

${parameter##word}

x=/one/two/three
echo ${x##*/}
three

シェルが設定するパラメータ

次のパラメータはシェルが自動的に設定します。

#

定位置パラメータ数 (10 進数)

呼び出し時に、または set コマンドによってシェルに与えられたフラグ。

?

最後に実行されたコマンドが返した 10 進数。

$

このシェルのプロセス番号。

_

_ の値は、最初は環境 (environment) に引き渡される実行中のシェルまたはスクリプトの絶対パス名です。その後、直前のコマンドの最後の引数が代入されます。このパラメータは、非同期式のコマンドに関しては設定されません。このパラメータは、メールのチェック時にも、一致する MAIL ファイルの名前を保持するために使用されます。

!

最後に呼び出されたバックグラウンドコマンドのプロセス番号。

ERRNO

最後に失敗したシステムコールにより設定された errno の値。この値はシステムに依存し、デバッグのために使用されます。

LINENO

実行中のスクリプトまたは関数内での現在行の行番号。

OLDPWD

cd コマンドで設定された直前の作業用ディレクトリ。

OPTARG

getopts 特殊コマンドで処理された最後のオプション引数の値。

OPTIND

getopts 特殊コマンドで処理された最後のオプション引数のインデックス。

PPID

シェルの親のプロセス番号。

PWD

cd コマンドで設定された現在の作業用ディレクトリ。

RANDOM

この変数を参照するたびに、0 から 32767 の間で均一に分散した乱整数を生成します。RANDOM に数値を代入すると、乱数の並びを初期化できます。

REPLY

この変数は、引数指定のない select 文または read 特殊コマンドによって設定されます。

SECONDS

この変数を参照するたびに、シェルを起動してからの秒数が返されます。この変数に値を代入すると、その値と代入処理実行時からの秒数との合計値が参照時に返されます。

シェルが使用する変数

次の変数はシェルによって使用されます。

CDPATH

cd コマンドの検索パスを指定します。

COLUMNS

この変数を設定すると、その値によってシェル編集モード用と選択 (select) リスト出力用の編集ウィンドウの幅が定義されます。

EDITOR

この変数の値が emacsgmacs、または vi で終わり、VISUAL 変数が設定されていない場合は、該当するオプションが有効になります。set 特殊コマンドを参照してください。

ENV

この変数は、対話型シェルが呼び出されたときにだけシェルによるパラメータ展開の対象になります。その結果得られた値は、現在の環境で実行するシェルコマンドを含むファイルのパス名として使用されます。このファイルは実行可能形式でなくてもかまいません。ENV を展開した値が絶対パス名でない場合、結果は不確定です。ユーザーの実ユーザー ID と実効ユーザー ID が異なっていたり、実グループ ID と実効グループ ID が異なっていたりすると、ENV は無視されます。

この変数を使って、シェルの呼び出しだけに有効な別名やほかの項目を設定できます。ENV が参照するファイルは $HOME/.profile とは異なります。つまり、.profile が通常はセッションの起動時に実行されるのに対し、ENV ファイルはシェルを呼び出すたびに最初に実行されます。ENV の値はドットスクリプトと同じように解釈されます。つまり、コマンドは現在の環境で実行され、ファイルは実行可能でなくてもかまいませんが、読み取り可能である必要があります。ただし、ドットスクリプトとは異なり、PATH の検索は行われません。これは「トロイの木馬」型のセキュリティー侵入から保護するために使われます。

FCEDIT

fc コマンドのデフォルトのエディタ名。

FPATH

関数定義の検索パス。デフォルトでは、PATH 変数のあとで FPATH のディレクトリを検索します。実行可能ファイルを見つけると、それを現在の環境で実行します。–u 属性を持つ関数が参照された場合は、PATH 変数の前に FPATH のディレクトリを検索します。設定済みの別名である autoload を使用すると、–u 属性を持つ関数を生成できます。

HISTFILE

シェルの起動時にこの変数が設定されていると、その値はコマンド履歴を格納するために使用されるファイルのパス名になります。「コマンド再入力」を参照してください。

HISTSIZE

シェルの起動時にこの変数が設定されていると、このシェルで使用可能な入力済みコマンドの数がこの値以上になります。デフォルト値は 128 です。

HOME

cd コマンドのデフォルト引数 (ホームディレクトリ)。

IFS

内部フィールド区切り文字。通常はスペース、タブ、および復帰改行です。コマンドまたはパラメータの置換によって生じるコマンドワードを区切る場合と、read 特殊コマンドでワードを区切る場合に使用します。$* 置換で引数を区切るときは、IFS 変数の最初の文字を使用します。「クォート」を参照してください。

LANG

未設定または NULL の国際化変数に対するデフォルト値を指定します。国際化変数のいずれかが無効な値に設定されていると、変数が 1 つも定義されていないように動作します。

LC_ALL

LC_* 変数のデフォルト値を提供します。

LC_COLLATE

パターンマッチングに含まれる範囲式、同等クラス、および複数バイト文字照合要素の動作を決定します。

LC_CTYPE

シェルの文字処理方法を決定します。LC_CTYPE に有効な値が設定されていると、シェルはそのロケールに合った文字を含むテキストやファイル名を表示および処理できます。環境に LC_CTYPE (environ(5) を参照) が設定されていなければ、シェルの動作は環境変数 LANG によって決定されます。LC_ALL が設定されていれば、その内容が LANG 変数やその他の LC_* 変数より優先されます。

LC_MESSAGES

メッセージをどの言語で出力するかを決定します。

LINENO

この変数は、各コマンドの実行前に、シェルによってスクリプトまたは関数内の現在の行番号 (1 から始まる連続した番号) を表す 10 進数に設定されます。ユーザーが LINENO を設定解除または再設定すると、現在のシェルの動作中は、この変数が持つ特別な意味が失われます。シェルが現在スクリプトも関数も実行していない場合、LINENO の値は不特定です。

LINES

この変数を設定すると、その値は選択 (select) リスト出力用のカラム長の決定に使用されます。選択リストは、LINES が示す行数の約 3 分の 2 がいっぱいになるまで垂直に出力されます。

MAIL

この変数にメールファイルの名前が設定されていて、MAILPATH 変数が設定されていない場合、シェルは指定されたファイルにメールが到着するとユーザーに通知します。

MAILCHECK

MAILPATH 変数または MAIL 変数で指定されたファイルの更新時間の変更をシェルが何秒ごとにチェックするかを指定します。デフォルト値は 600 秒です。この時間が経過すると、シェルは次のプロンプトを出力する前にチェックします。

MAILPATH

コロン (:) で区切ったファイル名のリスト。この変数を設定すると、シェルは直前の MAILCHECK 秒間に発生した指定ファイルに対する変更をユーザーに通知します。各ファイル名のあとには ? と、出力されるメッセージを指定できます。このメッセージには、変更されたファイルの名前として定義された $_ 変数によるパラメータ置換が行われます。デフォルトのメッセージは you have mail in $_ です。

NLSPATH

LC_MESSAGES 処理用のメッセージカタログの場所を決定します。

PATH

コマンド用の検索パス。「実行」を参照してください。rksh の環境下で実行する場合 (.profile の場合を除く)、ユーザーは PATH を変更できません。

PPID

この変数は、シェルによってシェルを呼び出したプロセスのプロセス ID (10 進数) に設定されます。サブシェルでは、PPID は現在のシェルの親と同じ値に設定されます。たとえば、echo $PPID(echo $PPID) は同じ値を生成します。

PS1

この変数の値はパラメータ置換用に展開され、1 次プロンプト文字列を定義します。デフォルトは $ です。1 次プロンプト文字列内の文字 ! は、コマンド番号で置換されます。「コマンド再入力」を参照してください。! を 2 つ連続して指定すると、プロンプト文字列の出力時に ! が 1 つ表示されます。

PS2

2 次プロンプト文字列を指定します。デフォルトは > です。

PS3

select ループ内で使用する選択プロンプト文字列を指定します。デフォルトは #? です。

PS4

この変数の値は、パラメータ置換用に展開され、実行トレースの各行の前に出力されます。省略すると、実行トレースプロンプトは + になります。

PWD

シェルを初期化したときに、シェルによって現在の作業用ディレクトリの絶対パスに設定されます。このパスには、シンボリックリンクタイプのコンポーネント、ドット (.) のコンポーネント、およびドットドット (..) のコンポーネントは含まれません。アプリケーションが PWD の値を設定または設定解除した場合、cd および pwd ユーティリティーの動作は不確定です。

SHELL

シェルのパス名は環境内に保持されます。起動時に、この変数のベース名が rshrksh、または krsh の場合、シェルの機能は制限されます。

TMOUT

0 より大きい値に設定すると、PS1 プロンプトの出力後、指定された秒数以内にコマンドが入力されない場合にシェルが終了します。この値をユーザーが超えられないような大きい値に設定してシェルをコンパイルすることもできます。

VISUAL

この変数の値が emacsgmacs、または 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 文字列を含め、任意の文字列と一致します。

?

任意の単一文字と一致します。

[...]

括弧内のいずれか 1 文字を表します。2 つの 文字を で区切ると、その間にある任意の文字 (その 2 つの文字も含む) に一致します。先頭の [ の次の文字が ! である場合、[ ] で囲まれていない任意の文字と一致します。 は、最初の文字または最後の文字として文字セットに挿入できます。

pattern-list は、| で区切られた 1 つまたは複数のパターンのリストです。複合パターンは、次のうちの 1 つまたは複数で構成されます。

?(pattern-list)

指定されたパターンのいずれかと任意に一致します。

*(pattern-list)

指定されたパターンの 0 回以上の出現と一致します。

+(pattern-list)

指定されたパターンの 1 回以上の出現と一致します。

@(pattern-list)

指定されたパターンのうち 1 つだけと一致します。

!(pattern-list)

指定されたパターンのうち 1 つだけを除き、あらゆるものと一致します。

クォート

前述 (「定義」を参照) のメタキャラクタは、それぞれシェルに対して特別な意味を持ち、クォートしないかぎり、ワードの終わりを表します。文字は、その前に \ を指定すればクォートされます。つまり、その文字自身を示すことができます。\ NEWLINE のペアは削除されます。一対の単一引用符 (' ') で囲まれた文字はすべてクォートされます。単一引用符を、単一引用符で囲んで表示させることはできません。一対の二重引用符 ("") で囲まれた文字列内では、パラメータとコマンドの置換が発生し、\\`"、および $ をクォートします。$*$@ の意味は、クォートされていない場合や、パラメータの代入値またはファイル名として使用される場合は同じです。ただし、コマンド引数として使用する場合、$*$1d $2d... と同等になります。dIFS 変数の最初の文字です。一方、$@$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 項式をいくつか組み合わせて構築できます。

–a file

file が存在すれば、真です。

–b file

file が存在し、ブロック型特殊ファイルであれば、真です。

–c file

file が存在し、文字型特殊ファイルであれば、真です。

–d file

file が存在し、ディレクトリであれば、真です。

–e file

file が存在すれば、真です。

–f file

file が存在し、通常ファイルであれば、真です。

–g file

file が存在し、setgid ビットが設定されていれば、真です。

–h file

file が存在し、シンボリックリンクであれば、真です。

–k file

file が存在し、スティッキービットが設定されていれば、真です。

–n string

string の長さがゼロでなければ、真です。

–o option

option という名前のオプションが有効であれば、真です。

–p file

file が存在し、FIFO 特殊ファイルまたはパイプであれば、真です。

–r file

file が存在し、現在のプロセスで読み取り可能であれば、真です。

–s file

file が存在し、サイズがゼロより大きければ、真です。

–t fildes

ファイル記述子番号が fildes であるファイルが開いていて、端末デバイスに対応していれば、真です。

–u file

file が存在し、setuid ビットが設定されていれば、真です。

–w file

file が存在し、現在のプロセスで書き込み可能であれば、真です。

–x file

file が存在し、現在のプロセスで実行可能であれば、真です。file が存在し、ディレクトリである場合は、現在のプロセスにそのディレクトリを検索する権限があります。

–z string

string の長さがゼロであれば、真です。

–L file

file が存在し、シンボリックリンクであれば、真です。

–O file

file が存在し、このプロセスの実効ユーザー ID がそのファイルを所有していれば、真です。

–G file

file が存在し、ファイルのグループがこのプロセスの実効グループ ID と一致していれば、真です。

–S file

file が存在し、ソケットであれば、真です。

file1 –nt file2

file1 が存在し、file2 よりも新しい場合は、真です。

file1 –ot file2

file1 が存在し、file2 よりも古い場合は、真です。

file1 –ef file2

file1file2 が存在し、同じファイルを参照していれば、真です。

string

文字列 string が NULL 文字列でなければ、真です。

string == pattern

stringpattern と一致すれば、真です。

string = pattern

== と同じですが、廃止されました。

string != pattern

stringpattern と一致しなければ、真です。

string1 < string2

カテゴリ LC_COLLATE のロケール設定に応じて解釈された文字列に基づいて、string1string2 より小さければ、真です。

string1 > string2

カテゴリ LC_COLLATE のロケール設定に応じて解釈された文字列に基づいて、string1string2 より大きければ、真です。

exp1 –eq exp2

exp1exp2 と等しければ、真です。

exp1 –ne exp2

exp1exp2 と等しくなければ、真です。

exp1 –lt exp2

exp1exp2 未満であれば、真です。

exp1 –gt exp2

exp1exp2 より大きければ、真です。

exp1 –le exp2

exp1exp2 以下であれば、真です。

exp1 –ge exp2

exp1exp2 以上であれば、真です。

前述のそれぞれの式で、file/dev/fd/n (n は整数) という形式の場合は、記述子番号が n である開かれたファイルがテストされます。

次のいずれかを使用して、これらの基本式から複合式を構築できます。優先度の高いものから順に並べてあります。

(expression)

expression が真であれば、真です。式をグループ化するときに使用します。

! expression

expression が偽であれば、真です。

expression1 && expression2

expression1expression2 の両方が真であれば、真です。

expression1 || expression2

expression1expression2 のどちらかが真であれば、真です。

入出力

コマンドの実行前に、シェルが解釈する特殊な表記を使って入出力先を変更 (リダイレクト) できます。次の各項目は、単純コマンド内の任意の位置またはコマンドの前後に指定できますが、起動されたコマンドには引き渡されません。後述の場合を除き、word または digit を使用する前にコマンドとパラメータの置換が発生します。ファイル名生成が発生するのは、パターンが 1 つのファイルとだけ一致し、ブランク解釈が実行されない場合だけです。

<word

word というファイルを標準入力 (ファイル記述子 0) として使用します。

>word

word というファイルを標準出力 (ファイル記述子 1) として使用します。ファイルが存在しない場合は、ファイルを作成します。ファイルが存在し、–noclobber オプションが有効である場合は、エラーになります。その他の場合は、ファイルの長さがゼロになります。

>|word

> と同じですが、–noclobber オプションを無視します。

>>word

word というファイルを標準出力として使用します。ファイルが存在する場合、(EOF までシークしたあと) そのファイルに出力を追加します。そうでない場合は、ファイルを作成します。

<>word

word というファイルを標準入力として読み書き用に開きます。

<< []word

シェルへの入力として word と同一の行まで、または EOF まで読み取ります。word に対してパラメータ置換、コマンド置換、ファイル名生成を実行しません。here-document が生成されて標準入力になります。word のいずれかの文字がクォートされていると、ドキュメントの文字は解釈されません。クォートされている文字がなければ、パラメータとコマンドの置換が発生し、\NEWLINE が無視されます。また、\ を使って \$`、および word の最初の文字をクォートする必要があります。<< のあとに付加すると、word とドキュメントから先行するタブがすべて取り除かれます。

<&digit

ファイル記述子 digit から標準入力が複製されます (dup(2) を参照)。同様に、標準出力については >&digit を使用します。

<&−

標準入力を閉じます。同様に、標準出力については >&− を使用します。

<&p

並行プロセスからの入力を標準入力に移動します。

>&p

並行プロセスへの出力を標準出力に移動します。

前述のいずれかの前に数字が付く場合、参照されるファイル記述子番号は (デフォルトの 0 または 1 ではなく) その数字で指定された番号になります。例:

... 2>&1

前述の例では、ファイル記述子 2 をファイル記述子 1 から複製して、書き込み用に開きます。

リダイレクションを指定する場合、記述する順序が重要になります。シェルは、評価時点での (ファイル記述子とファイルの) 関連性について、各リダイレクションを評価します。例:

... 1>fname 2>&1

これは、まず fname というファイルにファイル記述子 1 を関連付けます。次に、ファイル記述子 1 (つまり fname) に関連するファイルに、ファイル記述子 2 を関連付けます。リダイレクションの向きが逆の場合は、まずファイル記述子 2 を端末に関連付け (ファイル記述子 1 はすでに端末に関連付けられているとして)、次にファイル記述子 1 をファイル fname に関連付けます。

ジョブ制御が有効でない場合にコマンドのあとに & を指定すると、コマンドのデフォルトの標準入力は /dev/null という空ファイルになります。それ以外の場合は、コマンドを実行するための環境に起動側シェルのファイル記述子 (入出力指定で変更可能) が含まれます。

環境

環境 (environment) は、通常の引数リストが実行されるプログラムに引き渡される場合と同様の方法で引き渡される、名前と値の対の集まりです (environ(5) を参照) 。名前は識別子、値は文字列である必要があります。シェルが環境と対話する方法はいくつかあります。シェルは、起動されると、環境を走査して、見つけた名前ごとに変数を作成し、対応する値を設定し、さらに export というマークを付けます。実行されるコマンドは環境を引き継ぎます。ユーザーがこれらの変数の値を変更するか、新しい変数を作成した場合は、export コマンドまたは typeset –x コマンドを使用すれば、それらの値が環境の一部になります。したがって、実行されるコマンドが参照する環境は、シェルが最初に引き継いだ名前と値のペア (その値は現在のシェルで変更可能) に、export コマンドまたは typeset –x コマンドで指定した変数を加えたものになります。

1 つまたは複数の変数代入を先頭に付加すれば、単純コマンドまたは関数の環境を拡張できます。変数代入引数は、identifier=value という形式のワードです。したがって、

TERM=450 cmd args

および

(export TERM; TERM=450; cmd args)

は、前述の 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 ファイルにも指定する必要があります。

関数定義コマンド

関数とは、新しい定位置パラメータとともに複合コマンドを呼び出すための単純コマンドとして使用されるユーザー定義の名前です。関数は「関数定義コマンド」を使って定義します。

関数定義コマンドの形式は次のとおりです。

fname() compound-command[io-redirect ...]

fname は名前でなければならず、これが関数名になります。実装によっては、拡張機能として、ほかの文字を関数名に使用できる場合があります。その場合は、関数と変数を別個の名前空間で管理します。

関数定義コマンド中の () は、2 つの演算子で構成されます。したがって、ブランク文字と fname(、および ) を混在させることもできますが、その必要はありません。

引数 compound-command は、複合コマンドを表します。

関数を宣言したときは、compound-commandio-redirect のテキストに対して wordexp の展開処理は行われません。すべての展開処理は、通常のように、関数が呼び出されるたびに行われます。同様に、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

number が示す番号のジョブ

%string

コマンド行が string で始まるジョブ

%?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 というシェル変数は、コマンドを含んでいるディレクトリの検索パスを定義します。2 つのディレクトリ名は、コロン (:) で区切ります。デフォルトのパスは /usr/bin: です (/usr/bin および現在のディレクトリの順に指定)。現在のディレクトリは、複数のコロンを連続して記述するか、パスリストの始めか終わりにコロンを付ければ指定できます。コマンド名に / が含まれている場合は、検索パスは使用されません。そうでない場合は、パスにおける各ディレクトリに実行可能ファイルがあるか検索します。ファイルが実行権を持っているが、ディレクトリや a.out ファイルでない場合は、シェルコマンドの入ったファイルとみなされます。そのファイルを読み取るときは、サブシェルが生成されます。この場合、エクスポートされていない別名、関数、および変数はすべて削除されます。括弧で囲まれたコマンドは、エクスポートされていないものを削除することなく、サブシェルで実行されます。

コマンド行の再入力

端末装置から最近入力された HISTSIZE が示す個数 (デフォルトは 128 個) のコマンドのテキストは、履歴ファイルに保存されています。$HOME/.sh_history というファイルは、HISTFILE 変数が設定されていない場合、または変数が示すファイルが書き込み不可能な場合に使用されます。シェルは、同じ名前の HISTFILE を使用する対話型シェルすべてのコマンド履歴を使用できます。fc という特殊コマンドは、このファイルの一部をリスト表示または編集するときに使用します。編集またはリスト表示されるファイルの部分は、番号か、またはコマンドの最初の文字を指定することによって選択できます。単一のコマンドを指定することも、コマンドの範囲を指定することも可能です。fc の引数としてエディタプログラムが指定されていないと、FCEDIT という変数の値が使用されます。FCEDIT が未定義の場合は、/bin/ed が使用されます。編集されたコマンドは、エディタを終了した時点で 表示および再実行されます。エディタ名に を指定すると、編集段階が省かれ、コマンドが再実行されます。この場合、old=new という形式の代入パラメータを使用すれば、実行前にコマンドを変更できます。たとえば、r'fc –e ' の別名として定義されている場合に 'r bad=good c' と入力すると、c という文字で始まるコマンドのうち最新のものが、その記述中の最初の bad という文字列を good に置き換えて再実行されます。

インライン編集オプション

通常、端末装置から入力する各コマンド行では、コマンドのあとに復帰改行 (RETURN または LINEFEED) しか入力できません。emacsgmacsvi のいずれかのオプションが有効な場合、ユーザーはコマンド行を編集できます。いずれかのオプションを set すれば、対応する編集モードになります。編集オプションは、いずれかのオプション名で終了する値を VISUAL 変数または EDITOR 変数に代入するたびに、自動的に選択されます。

編集機能では、ユーザーの端末が RETURN を改行のないキャリッジリターンとして扱うこと、およびスペース文字がスクリーン上の現在の文字を上書きすることが必要です。

これらの編集モードは、ユーザーがウィンドウを介して現在の行を見るという概念を実現します。ウィンドウ幅は、COLUMNS が定義されていればその値になり、未定義の場合は 80 になります。ウィンドウの幅が小さすぎて、プロンプトを表示すると入力用に 8 カラム以上残すことができない場合は、プロンプトが左端から切り捨てられます。ウィンドウ幅から 2 を引いた長さより行が長い場合は、ウィンドウの終わりにマークを表示してユーザーに通知します。カーソルが移動し、ウィンドウの境界に達すると、ウィンドウはカーソルを中心としてセンタリングされます。行がウィンドウの右端を超えている場合は > マーク、左端を超えている場合は < マーク、左右両端を超えている場合は * マークがそれぞれ表示されます。

各編集モードでは、検索コマンドから履歴ファイルにアクセスできます。パターンではなく文字列だけがマッチングの対象になります。ただし、文字列の先頭に ^ があると、マッチングの開始位置が行の先頭に限定されます。

emacs 編集モード

emacs または gmacs オプションを有効にすると、対応する編集モードに移行します。この 2 つのモードは、^T の扱い方だけが異なります。編集を行うには、訂正が必要な位置にカーソルを移動し、必要に応じて文字やワードを挿入または削除します。編集用のコマンドは、いずれも制御文字またはエスケープシーケンスです。制御文字は、キャレット (^) とそれに続く文字で表記されます。たとえば、^FCTRL-F を表します。つまり、CTRL (コントロール) キーを押しながら f キーを押します。シフトキーは押しません。^? は DEL (削除) キーを表します。

エスケープシーケンスは M- とそれに続く文字で表記されます。たとえば、M-f (メタ f と呼ぶ) は ESC キー (ASCII コード 033) に続いて f を押すことで入力します。M-F は ESC キーに続いて SHIFT キーを押しながら (大文字の) F を入力することを表します。

すべての編集コマンドは、行の先頭だけでなく、行のどこからでも実行できます。特に断りのないかぎり、編集コマンドのあとに RETURN キーや LINEFEED キーは入力しません。

^F

カーソルを 1 文字だけ前方 (右) に移動します。

M-f

カーソルを 1 単語だけ前方に移動します。emacs エディタでは、「ワード」は英文字、数字、および下線からなる文字列を意味します。

^B

カーソルを 1 文字だけ後方 (左) に移動します。

M-b

カーソルを 1 単語だけ後方に移動します。

^A

カーソルを行の先頭に移動します。

^E

カーソルを行の末尾に移動します。

^]char

現在の行で文字 char が次に現れる位置にカーソルを移動します。

M-^]char

現在の行で文字 char が直前に現れた位置にカーソルを移動します。

^X^X

カーソルとマークを入れ替えます。

erase

(ユーザーが stty(1) コマンドで定義した消去文字。通常は ^H または #) 前の 1 文字を削除します。

^D

現在の文字を削除します。

M-d

現在のワードを削除します。

M-^H

(メタ - バックスペース) 直前の単語を削除します。

M-h

直前のワードを削除します。

M-^?

(メタ -DEL) 直前のワードを削除します (割り込み文字が ^? (デフォルトの DEL) の場合、このコマンドは動作しません)。

^T

emacs モードでは、現在の文字と次の文字を入れ替えます。gmacs モードでは、直前の 2 つの文字を入れ替えます。

^C

現在の文字を大文字にします。

M-c

現在のワードを大文字にします。

M-l

現在のワードを小文字にします。

^K

カーソルから行の末尾までを削除します。直前に指定された数値パラメータの値が現在のカーソル位置より小さい場合は、指定された位置の文字から現在のカーソル位置の文字までを削除します。直前に指定された数値パラメータの値が現在のカーソル位置より大きい場合は、現在のカーソル位置の文字から指定された位置の文字までを削除します。

^W

カーソル位置の文字からマークまでを抹消します。

M-p

カーソル位置からマークまでの領域をスタックにプッシュします。

kill

(ユーザーが stty(1) コマンドで定義した抹消文字。通常は ^G または @) 現在の行全体を抹消します。2 つの kill 文字を連続して入力すると、その後の kill 文字はすべて改行を意味します。プリンタ端末 (印字式端末) を使用している場合に便利です。

^Y

行から最後に削除された項目を復元します。つまり、記憶していた項目を行に戻します。

^L

復帰改行して、現在の行を表示します。

^@

(NULL 文字) マークを設定します。

M-space

(メタ - スペース) マークを設定します。

J

(NEWLINE) 現在の行を実行します。

M

(RETURN) 現在の行を実行します。

eof

現在の行が NULL の場合のみ、end-of-file 文字 (通常は ^D) を end-of-file として処理します。

^P

直前のコマンドを取り出します。^P を入力するたびに、さらに前のコマンドにアクセスします。複数行にまたがるコマンドで最初の行でない場合は、1 行戻ります。

M-<

もっとも古いコマンド行の履歴を取り出します。

M->

もっとも新しいコマンド行の履歴を取り出します。

^N

次のコマンド行を取り出します。^N を入力するたびに、さらに次のコマンドにアクセスします。

^Rstring

履歴をさかのぼって、string を含むコマンド行を検索します。パラメータとして 0 を指定すると、順方向に検索します。string の終わりは復帰改行 (RETURN または NEWLINE) で示します。string の先頭に ^ が付加されると、その文字列で始まるコマンドだけを検索します。string を省略すると、直前に指定した文字列を含む次のコマンド行にアクセスします。この場合、パラメータとして 0 を指定すると検索方向が逆になります。

^O

(Operate) 現在の行を実行し、現在の行に対する次の行を履歴ファイルから取り出します。

M-digits

(エスケープ) 数値パラメータを定義します。digits は次のコマンドに対するパラメータとみなされます。パラメータを受け入れるコマンドは、^F^Berase^C^D^K^R^P^N^]M-.M-^]M-_M-bM-cM-dM-fM-hM-l、および M-^H です。

M-letter

(ソフトキー) ユーザーの別名リスト中で、_letter という名前の別名を検索します。この名前の別名が定義されていれば、入力待ち行列にその値を挿入します。letter は、前述の各メタ関数を示す文字であってはいけません。

M-[letter

(ソフトキー) ユーザーの別名リスト中で、__letter という名前の別名を検索します。この名前の別名が定義されていれば、入力待ち行列にその値を挿入します。この機能は、多くの端末でファンクションキーをプログラムするために使用できます。

M−.

直前のコマンドの最後のワードを行に挿入します。数値パラメータが指定されると、最後のワードではなくその数値が示す位置のワードを挿入します。

M−_

M−. と同じです。

M−*

アスタリスクがワードの最後に付加され、ファイル名が展開されます。

M−ESC

ファイル名を補完します。現在のワードにアスタリスクを付加したものと一致するすべてのファイル名の最長の前方一致部分で、現在のワードを置き換えます。一致するものが 1 つしかない場合、ファイルがディレクトリなら / を付加し、ファイルがディレクトリでないならスペースを付加します。

M−=

現在のワードパターンのあとにアスタリスクを付加すれば一致するファイル名をリスト表示します。

^U

次のコマンドのパラメータを 4 倍します。

\

次の文字をエスケープします。編集用文字、ユーザーが設定した消去文字、抹消文字、および割り込み文字 (通常は ^?) は、その前に \ を指定すれば、コマンド行または検索文字列に入力できます。\ は、次の文字の編集機能 (もしあれば) を無効にします。

^V

シェルのバージョンを表示します。

M-#

# を行の先頭に挿入したあと、その行を実行します。これによって、履歴ファイルにコメントを挿入できます。

vi 編集モード

2 つの入力モードがあります。初期状態では、コマンドを入力すると入力モードに移行します。編集するときは、エスケープ (ESC) キー (033) を入力して制御モードに移行し、訂正が必要な箇所にカーソルを移動してから、必要に応じて文字やワードを挿入または削除します。ほとんどの制御コマンドでは、コマンドの先頭に繰り返し数を指定できます。

ほとんどのシステムでは、vi モードに移行した直後は標準処理が有効になります。端末の回線速度が 1200 ボー以上であり、制御文字が含まれているか、またはプロンプトが表示されてからの経過時間が 1 秒未満であれば、コマンドが再度表示されます。ESC 文字を入力すると、コマンドの残りの部分に対する標準処理が終了し、ユーザーはコマンド行を変更できるようになります。この方式には、標準処理で raw モードの先行入力表示機能を利用できるという利点があります。

viraw オプションも設定すると、端末の標準処理を常に無効にできます。このモードは、行の終わりの区切りを示す 2 つの代替記号をサポートしていないシステムでは暗黙的に設定されており、特定の端末で便利なことがあります。

入力編集コマンド

デフォルトでは、エディタは入力モードになります。

erase

(ユーザーが stty(1) コマンドで定義した消去文字。通常は ^H または #) 前の 1 文字を削除します。

^W

直前の、ブランクで区切られたワードを削除します。

^D

シェルを終了します。

^V

次の文字をエスケープします。編集用の文字、ユーザーの定義した消去文字または抹消文字は、その前に ^V を入力すれば、コマンド行または検索文字列に入力できます。^V は、次の文字の編集機能 (もしあれば) を無効にします。

\

次の erase または抹消文字をエスケープします。

移動編集コマンド

次のコマンドはカーソルを移動します。

[count]l

1 つ先 (右) の文字にカーソルを移動します。

[count]w

1 つ先の英数字のワードにカーソルを移動します。

[count]W

ブランクのあとに続く次のワードの先頭にカーソルを移動します。

[count]e

ワードの終わりにカーソルを移動します。

[count]E

ブランクで区切られた現在のワードの終わりにカーソルを移動します。

[count]h

1 つ前 (左) の文字にカーソルを移動します。

[count]b

1 つ前のワードにカーソルを移動します。

[count]B

ブランクで区切られた直前のワードに移動します。

[count]|

count が示すカラムにカーソルを移動します。

[count]fc

現在の行で文字 c が次に現れる位置にカーソルを移動します。

[count]Fc

現在の行で文字 c が前に現れる位置にカーソルを移動します。

[count]tc

fh を連続して実行した場合と同等です。

[count]Tc

Fl を連続して実行した場合と同等です。

[count];

直前の単一文字検索コマンドの fFt、または Tcount の数だけ繰り返します。

[count],

直前の単一文字検索コマンドを count の数だけ逆方向で実行します。

0

行の先頭にカーソルを移動します。

^

行に含まれる最初のブランク以外の文字にカーソルを移動します。

$

行の終わりにカーソルを移動します。

%

現在の位置にある括弧記号 (){}[、または ] に対応する括弧記号にカーソルを移動します。現在の文字が前述のいずれの括弧でもない場合は、行の残りから最初に現れる括弧を検索します。

検索編集コマンド

次の各コマンドはコマンド履歴にアクセスします。

[count]k

直前のコマンドを取り出します。k を入力するたびに、さらに前のコマンドにアクセスします。

[count]

k と同等です。

[count]j

次のコマンドを取り出します。j を入力するたびに、さらに次のコマンドにアクセスします。

[count]+

j と同等です。

[count]G

count が示す番号のコマンドを取り出します。デフォルトでは、もっとも古いコマンド履歴を取り出します。

/string

履歴をさかのぼって、string を含むコマンドを検索します。string の終わりは復帰改行 (RETURN または NEWLINE) で示します。string の先頭に ^ が付加されると、その文字列で始まるコマンドだけを検索します。string が NULL の場合は、直前に指定された文字列を使用します。

?string

/ と同じですが、順方向に検索します。

n

直前の / または ? コマンドで指定されたパターンと一致する次のパターンを検索します。

N

直前の / または ? コマンドで指定されたパターンと一致する次のコマンドを逆方向に検索します。以前に / コマンドで入力された string (文字列) の履歴を検索します。

テキスト変更編集コマンド

次の各コマンドは行を変更します。

a

入力モードに移行し、現在の文字のあとにテキストを入力します。

A

行の終わりにテキストを追加します。$a と同等です。

[count]cmotion
c[count]motion

現在の文字から motion によりカーソルが移動する先までの文字を削除し、入力モードに移行します。motionc の場合は、行全体を削除して入力モードに移行します。

C

現在の文字から行の終わりまでを削除し、入力モードに移行します。c$ と同等です。

[count]s

count 個の文字を削除して入力モードに移行します。

S

cc と同等です。

D

現在の文字から行の終わりまでを削除します。d$ と同等です。

[count]dmotion
d[count]motion

現在の文字から motion によりカーソルが移動する先までの文字を削除します。motiond の場合は、行全体を削除します。

i

入力モードに移行し、現在の文字の前にテキストを入力します。

I

行の先頭にテキストを挿入します。0i と同等です。

[count]P

カーソルの前に、直前のテキスト変更を挿入します。

[count]p

カーソルのあとに、直前のテキスト変更を挿入します。

R

入力モードに移行して、画面上の文字を重ね打ちした文字に置き換えます。

[count]rc

現在のカーソル位置から始まる count 個の文字を c に置き換え、カーソルの位置を進めます。

[count]x

現在の文字を削除します。

[count]X

直前の文字を削除します。

[count].

直前のテキスト変更コマンドを繰り返します。

[count]~

現在のカーソル位置から始まる count 個の文字を、大文字の場合は小文字に、小文字の場合は大文字に変換して、カーソルの位置を進めます。

[count]_

直前のコマンドの count 個のワードを付加し、入力モードに移行します。count を省略すると、最後のワードを使用します。

*

* を現在のワードのあとに付加し、ファイル名を生成しようとします。一致するものが見つからない場合は、ベルを鳴らします。見つかった場合は、ワードを一致したパターンで置換し、入力モードに移行します。

\

ファイル名を補完します。現在のワードにアスタリスクを付加したものと一致するすべてのファイル名の最長の前方一致部分で、現在のワードを置き換えます。一致するものが 1 つしかない場合、ファイルがディレクトリなら / を付加し、ファイルがディレクトリでないならスペースを付加します。

その他の編集コマンド

その他の編集コマンドを次に示します。

[count]ymotion
y[count]motion

現在の文字から motion によりカーソルが移動する先までの文字を記憶し、削除用バッファーに入れます。テキストとカーソルは変更しません。

Y

現在の位置から行の終わりまでの文字を記憶します。y$ と同等です。

u

直前のテキスト変更コマンドを取り消します。

U

現在の行で実行されたテキスト変更コマンドをすべて取り消します。

[count]v

fc –e ${VISUAL:–${EDITOR:–vi}} count コマンドを入力バッファーに戻します。count を省略すると、現在の行を使用します。

^L

復帰改行して、現在の行を表示します。制御モードでのみ有効です。

J

(NEWLINE) モードに関係なく、現在の行を実行します。

M

(RETURN) モードに関係なく、現在の行を実行します。

#

コマンドの先頭文字が # であれば、その # およびそのあとのそれぞれの改行直後の # を削除します。先頭文字がほかの文字であれば、# をコマンドの各行の先頭に挿入後、行を送ります。現在の行をコメントとして履歴に挿入する場合や、履歴ファイルに含まれる以前のコメント化されたコマンドからコメントを削除する場合に便利です。

=

現在のワードのあとにアスタリスクを付加した場合に一致するファイル名を一覧表示します。

@letter

ユーザーの別名リスト中で、_letter という名前の別名を検索します。この名前の別名が定義されていれば、処理待ちの入力待ち行列にその値を挿入します。

特殊コマンド

次の単純コマンドは、シェルプロセス中で実行されます。入出力のリダイレクトが可能です。特に断りのないかぎり、出力はファイル記述子 1 上に書き込まれ、構文エラーがなければ終了ステータスは 0 です。1 つまたは 2 つのアスタリスク (*) が先頭に付加されているコマンドは、次のような特殊な処理を受けます。

  1. コマンドが完了しても、コマンドの直前の変数代入リストは依然として有効です。

  2. 入出力のリダイレクトは変数代入後に行われます。

  3. エラーが発生すると、それを含むスクリプトは中止されます。

  4. 変数代入形式で、** から始まるコマンドに続くワードは、変数代入と同一の規則で展開されます。つまり、チルド置換は = 符号のあとに実行され、ワード分割とファイル名生成は実行されません。

* : [ arg ... ]

パラメータの展開だけを行います。

* . file [ arg ... ]

file 全体を読み取ってからコマンドを実行します。コマンドは現在のシェル環境において実行されます。PATH によって指定された検索パスを用いて、file を含むディレクトリを探します。引数の arg は (指定されていれば) 定位置パラメータになります。そうでない場合、定位置パラメータは変更されません。終了ステータスは、最後に実行されたコマンドの終了ステータスです。

** alias [ –tx ] [ name[ =value ] ] ...

引数なしの場合、このコマンドは標準出力上に name=value という形式の別名のリストを表示します。value が指定された名前に対しては別名を定義します。value の末尾にスペースがあると、次のワードが別名置換指定かどうかをチェックします。–t フラグは、検索済みの別名を設定または一覧表示します。検索済み別名の値は、指定した name に対応する完全パス名になります。PATH の値を再設定するとこの値は未定義になりますが、別名は検索済みのままです。–t フラグを省略すると、value が指定されていない引数リスト内の各 name について、別名の名前と値を表示します。–x フラグは、エクスポートされた別名を設定または表示します。エクスポートされた別名は、名前で起動されるスクリプト用に定義されます。name が指定されているが、value は指定されておらず、name に対しての別名も定義されていない場合は、終了ステータスが 0 以外になります。

bg [ %job... ]

このコマンドを使用できるのは、ジョブ制御をサポートするシステム上だけです。指定された各 job をバックグラウンドで実行します。job が省略された場合は、現在のジョブをバックグラウンドで実行します。job の記述形式については、前述の「ジョブ」節を参照してください。

* break [ n ]

for ループ、while ループ、until ループ、または select ループがあれば終了します。n を指定すると、n レベル分だけループを終了します。処理に含まれるループ数より n が大きい場合には、もっとも外側のループで終了します。

* continue [ n ]

for ループ、while ループ、until ループ、または select ループの次の繰り返しを実行します。n を指定すると、n 番目のループから実行します。処理に含まれるループ数より n が大きい場合には、最も外側のループが使用されます。

cd [ –L ] [ –P ] [ arg ]
cd old new

このコマンドは 2 つの形式のいずれかで入力します。第 1 の形式は、現在のディレクトリを arg に変更します。arg の場合、ディレクトリを直前のディレクトリに変更します。シェル変数 HOME の値がデフォルトの arg になります。PWD 環境変数は、現在のディレクトリに設定されます。PWD が変更された場合、OLDPWD 環境変数も古い作業用ディレクトリに変更されます。つまり、cd を呼び出す直前における現在の作業用ディレクトリのことです。シェル変数 CDPATH は、arg を含むディレクトリの検索パスを定義します。2 つのディレクトリ名は、コロン (:) で区切ります。デフォルトのパスは 空の文字列です (現在のディレクトリの指定)。現在のディレクトリは空のパス名で指定します。このパス名は、等号の直後か、パスリスト内にある区切り文字のコロンの間に指定します。arg の先頭文字が / の場合、検索パスは使用しません。それ以外の場合は、パス中の各ディレクトリで arg を検索します。成功しなかった場合、cd は、PWD の値、スラッシュ文字、および arg を連結したパス名のディレクトリへ変更しようとします。

–L

オペランドのドットドット (..) を論理的に処理します。ドットドット部分が処理される前に、シンボリックリンク部分は解釈処理されません。

–P

オペランドのドットドット (..) を物理的に処理します。ドットドット部分が処理される前に、シンボリックリンク部分は解釈処理されます。

–L–P の両方のオプションを指定した場合、最後に呼び出された方のオプションが使用され、他方のオプションは無視されます。–L オプションと –P オプションをどちらも指定しない場合、オペランドのドットドット (..) は論理的に処理されます。

cd の第 2 の形式は、PWD 中の現在のディレクトリ名に含まれる old という文字列を new という文字列に置換し、この新規のディレクトリへ変更しようとします。cd コマンドは rksh では実行できません。

command [–p] [command_name] [argument ...]
command [–v | –V] command_name

command ユーティリティーを使用すると、シェルは関数の検索を実行せずに、指定された引数を単純コマンドとして扱います。–p フラグは、すべての標準ユーティリティーの検索を可能にする PATH のデフォルト値を使用して、コマンド検索を実行します。–v フラグは、標準出力に文字列を書き出します。この文字列は、現在のシェル実行環境でシェルが command_name を呼び出すために使用するパス名またはコマンドを表します。–V フラグも標準出力に文字列を書き出します。この文字列は、command_name オペランドに指定された名前を、シェルが現在のシェル実行環境でどのように解釈するかを表します。

echo [ arg ... ]

使用法と説明については、echo(1) を参照してください。

* eval [ arg ... ]

引数をシェルへの入力として読み取り、生成されるコマンドを実行します。

* exec [ arg ... ]

arg を指定すると、このシェルの代わりに、引数で指定されたコマンドを (新規プロセスは生成せずに) 実行します。入出力引数が指定可能で、現在のプロセスに影響を及ぼす場合があります。引数を指定しない場合は、ファイル記述子が入出力リダイレクションリストの指定どおりに変更されることになります。この場合、この機能を使って開かれた、ファイル記述子番号が 2 より大きいファイルは、別のプログラムを起動すると閉じられます。

* exit [ n ]

呼び出し元のシェルまたはシェルスクリプトを n で指定した終了ステータスで終了させます。具体的には、指定した値の最下位 8 ビットが終了ステータスの値となります。n を省略すると、最後に実行されたコマンドの終了ステータスがシェルの終了ステータスになります。トラップ実行中に exit が発生した場合、ここで言う最後に実行されたコマンドとは、トラップ呼び出し直前に実行されたコマンドを指します。ignoreeof オプションが有効になっているシェルを除き、EOF を検出した場合もシェルが終了します。set を参照してください。

** export [ name[=value] ] ...
** export –p

指定された name に対し、あとで実行されるコマンドの「環境」へ自動的にエクスポートされるようにマークを付けます。

–p を指定したとき、export は、すべてのエクスポートされる変数の名前と値を、次の形式で標準出力に書き出します。

"export %s=%s\n", name, value

これは、name が設定されている場合です。

"export %s\n", name

これは、name が設定されていない場合です。

コマンドとしてシェルに再入力できる形式で書き込まれる (引用も適切に使用される) ため、エクスポートされる変数の名前と値をシェル実行環境で再現するときに便利です。ただし、この場合、次のような制限があります。

  1. 出力時に値が設定されていた読み取り専用の変数は、元の状態には戻りません。

  2. 出力時に値が設定されていなかった変数に、状態を保存したときから保存した出力をシェルに再入力するまでの時間が値として割り当てられた場合、その変数は未設定の状態には戻りません (つまり、その値は保持されます)。

fc [ –e ename ] [ –nlr ] [ first [ last ] ]
fc –e [ old =new ] [ command ]
fc –s [ old=new ] [ command ]

第 1 の形式では、端末から最近入力された HISTSIZE 個のコマンドの中から、first から last までの範囲のコマンドを選択します。firstlast の両引数は、数値または文字列で指定できます。文字列の場合、その文字列で始まる最新のコマンドを見つけます。負の数値は、現在のコマンド番号からのオフセットとなります。–l オプションを指定すると、標準出力上にコマンドを一覧表示します。指定しないと、これらのキーボードコマンドの入ったファイル上で ename というエディタプログラムを起動します。ename が省略されていると、変数 FCEDIT (デフォルトは /bin/ed) の値をエディタとして使用します。編集が完了すると、編集されたコマンドを実行します。last を指定しない場合、 first と同一値に設定されます。first を指定しない場合、 デフォルトは、編集については直前のコマンドに、一覧表示については −16 になります。–r オプションはコマンドの順序を逆にします。–n オプションは一覧表示時にコマンド番号の出力を抑制します第 2 の形式では、old=new の置換を行なったあとで command が再実行されます。command 引数を省略すると、最後に行なったコマンドが実行されます。

fg [ %job... ]

このコマンドを使用できるのは、ジョブ制御をサポートするシステム上だけです。指定された各 job をフォアグラウンドで実行します。job が指定されないと、現在のジョブをフォアグラウンドで実行します。job の記述形式については、前述の「ジョブ」節を参照してください。

getopts optstring name [ arg ... ]

arg が正当なオプションを示しているかどうかをチェックします。arg を省略すると、定位置パラメータが使用されます。オプション引数は + または で始まります。+ または 以外の文字で始まっているオプション、また 引数があると、オプションの終わりとみなされます。optstring には、getopts が認識する文字を記述します。文字のあとに : が続く場合、そのオプションには引数があるとみなされます。オプションと引数とはブランクで区切ることができます。

arg+ で始まる場合、getopts+ を起動するたびに name 内で見つかった次のオプション文字を設定します。次の arg のインデックスは OPTIND に格納されます。オプション引数がある場合は OPTARG に格納されます。

optstring 内で先頭に : がある場合、getopts は無効なオプション文字を OPTARG に格納し、name? (未定義のオプションが指定された場合) または : (必要なオプション引数が省略されている場合) に設定します。getopts はエラーメッセージを表示します。オプションがなくなると、終了ステータスは 0 以外になります。使用法と説明については、getoptcvt(1) を参照してください。

getopts は、従来の単一文字の短いオプションも、Sun の Command Line Interface Paradigm (CLIP) で定義された長いオプションもサポートします。

長いオプションは短いオプションの別名です。長いオプションを指定するには、対応する短いオプションのあとに、長いオプションを括弧に囲んで指定します。たとえば、短いオプション「f」の別名として、長いオプション「file」を指定する場合、次のスクリプト行を使用します。


getopts "f(file)" opt

コマンド行上では、長いオプションの前に「--」または「++」を指定します。前述の例の場合、コマンド行上の「--file」は「-f」と同等であり、「++file」は「+f」と同等です。

短いオプションの別名として長いオプションを複数指定することはできますが、これは CLIP 仕様には違反することであり、使用するときには十分注意する必要があります。長いオプションを複数指定するときには、次のように、それぞれの長いオプションを括弧で囲む必要があります。


getopts "f:(file)(input-file)o:(output-file)"

前述の例の場合、「--file」と「--input-file」は両方とも「-f」と同等であり、「--output-file」は「-o」と同等です。

変数名は、常に、短いオプションに設定されます。コマンド行上で長いオプションを指定しても、変数名はそれと同等の短いオプションに設定されます。

hash [ name ... ]
hash [ –r ]

シェルは、各 name ごとに、それが示すコマンドの検索パス内の位置を決定し、記憶します。–r オプションを指定すると、シェルは記憶したすべての位置を忘れます。引数をまったく指定しないと、記憶されたコマンドに関する情報が表示されます。hits はシェルプロセスによってコマンドが呼び出された回数を表します。cost は、検索パスのコマンドを見つけるのに必要な作業です。コマンドが検索パスの相対ディレクトリにある場合、そのディレクトリの変更後にそのコマンドが格納された位置が再計算されます。この再計算が行われるコマンドに対しては、hits 情報の隣にアスタリスク (*) が示されます。Cost の値は、再計算が行われるたびに増加されます。

jobs [ –lnp ] [ %job ... ]

指定された各ジョブに関する情報を一覧表示します。job 引数を省略すると、活動中のジョブすべてに関する情報を一覧表示します。–l フラグは、通常の情報に加えてプロセス ID も表示します。–n フラグは、前回通知を受けたあとに停止または終了したジョブだけを表示します。–p フラグは、プロセスグループだけを表示します。job の記述形式については、前述の「ジョブ」節と jobs(1) を参照してください。

kill [ sig ] %job ...
kill [ sig ] pid ...
kill – l

TERM (終了) シグナルまたは指定されたシグナルのいずれかを、指定されたジョブまたはプロセスに送信します。シグナルは番号または名前で指定します。名前は、signal.h(3HEAD) に示された名前から「SIG」という接頭辞を取り除いたものです。ただし、SIGCHD は CHLD という名前になります。送信するシグナルが TERM (終了) または HUP (ハングアップ) の場合、停止中のジョブまたはプロセスには CONT (継続) シグナルを送信します。job という引数は、活動中のジョブではないプロセスのプロセス ID を指定することもできます。job の記述形式については、「ジョブ」を参照してください。第 2 の形式の kill –l は、シグナル番号とシグナル名をリスト表示します。

let arg...

arg は、評価の対象となる個々の算術式を表します。評価の方法については、前述の「算術評価」節を参照してください。

終了ステータスは、最後の式の値が 0 以外の場合は 0 で、0 の場合には 1 です。

login argument . . .

`exec login argument....' と同機能です。使用法と説明については、login(1) を参照してください。

* newgrp [ arg ... ]

exec /bin/newgrp arg .... と同機能です。

print [ –Rnprsu[n ] ] [ arg ... ]

シェルの出力メカニズムです。フラグを省略した場合、あるいは または – – フラグを指定した場合は、echo(1) で述べるように標準出力上に引数を表示します。出力ファイルが書き込み用に開いていない場合を除き、終了ステータスは 0 になります。

–n

復帰改行 (NEWLINE) の出力を抑止します。

–R | –r

(raw モード) echo のエスケープ規則を無視します。–R オプションは、–n を除く後続の引数およびオプションすべてを表示します。

–p

標準出力の代わりに |& で生成されたプロセスのパイプに引数を出力します。

–s

標準出力の代わりに履歴ファイルに引数を書き込みます。

–u [ n ]

出力を格納するファイル記述子番号を、1 桁の数値 n で指定します。デフォルト値は 1 です。

pwd [ –L | –P ]

ファイル名のドット (.) またはドットドット (..) を含まない、現在の作業用ディレクトリの絶対パス名を標準出力に書き出します。

–L

PWD 環境変数に、現在のディレクトリの絶対パス名 (ファイル名にドットまたはドットドットを含まない) が含まれている場合は、pwd はこのパス名を標準出力に書き出します。それ以外の場合、–L オプションは –P オプションと同様の結果を書き出します。

–P

書き込まれる絶対パス名にファイル名が含まれません。パス名のコンテキストでは、シンボリックリンク形式でファイル名が参照されます。

–L–P の両方が指定された場合は、最後に指定されたオプションが適用されます。–L–P も指定されない場合、pwd–L オプションと同様の結果を書き出します。

read [ –prsu[ n ] ] [ name?prompt ] [ name ... ]

シェルの入力メカニズム。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 です。

** readonly [ name[=value] ] ...
** readonly –p

指定された name を読み取り専用にします。あとの代入でこれらの名前を変更できないようにします。

–p を指定したとき、readonly は、すべての読み取り専用変数の名前と値を、次の形式で標準出力に書き出します。

"readonly %s=%s\n", name, value

これは、name が設定されている場合です。

"readonly $s\n", name

これは、name が設定されていない場合です。

コマンドとしてシェルに再入力できる形式で書き込まれるため、同じ読み取り専用の属性と値をシェル実行環境で再現するときに便利です。保存しておいた出力をシェルに再入力するときには、次のような制限があります。

  1. 出力時に値が設定されていた変数には、読み取り専用の属性は設定されません。

  2. 出力時に設定されていなかった変数には、値は設定されません。

* return [ n ]

シェル関数または . スクリプトを、n で指定された戻りステータスで呼び出し側スクリプトに戻します。具体的には、指定した値の最下位 8 ビットが終了ステータスの値となります。n を省略すると、戻りステータスは最後に実行された コマンドの戻りステータスになります。return を関数や '.' スクリプト実行中以外で起動すると、結果は exit と同一になります。

set [ ±abCefhkmnopstuvx ] [ ±o option ]. . .[ ±A name ] [ arg ... ]

このコマンドのフラグの意味は次のとおりです。

–A

配列の代入。name で示される変数の設定を解除し、arg リストから順々に値を割り当てます。+A は、最初の変数設定を解除しません。

–a

定義される後続の変数すべてを自動的にエクスポートします。

–b

バックグラウンドジョブの完了を非同期的にユーザーに通知します。次のメッセージが標準エラー出力に書き込まれます。


"[%d]%c %s%s\n", <job-number>, <current>, <status>, \
     whe<job-name>

各フィールドの意味を次に説明します。

<current>

文字 + は、fg または bg ユーティリティー用のデフォルトとして使用するジョブを表します。このジョブは、job_id %+ または %% を使って指定することもできます。文字 は、現在のデフォルトジョブが終了したときにデフォルトとなるジョブを表します。このジョブは、job_id %− を使って指定することもできます。その他のジョブでは、このフィールドはスペース文字となります。+ を使って表せるジョブの数は、どちらも最大 1 つです。停止中のジョブがあれば、現在のジョブも停止ジョブとなります。停止中のジョブが 2 つ以上あれば、以前のジョブも停止ジョブとなります。

<job-number>

waitfgbgkill の各ユーティリティー用にプロセスグループを識別するのに使用する番号。これらのユーティリティーを使うと、ジョブはジョブ番号の前に % を付加することにより識別できます。

<status>

指定なし。

<job-name>

指定なし。

シェルは、ジョブの終了をユーザーに通知したときに、そのジョブのプロセス ID を現在のシェル実行環境で認識されているプロセス ID のリストから削除することがあります。非同期の通知はデフォルトでは無効です。

–C

シェルのリダイレクト演算子「>」によって既存のファイルが上書きされるのを防ぎます。リダイレクト演算子「>|」は、個々のファイルに対して、このオプションよりも優先されます。

–e

コマンドの終了ステータスが 0 でない場合、ERR トラップ (設定されていれば) を実行し、終了します。このモードは、プロファイル読み取り時は無効です。

–f

ファイル名を生成しないようにします。

–h

各コマンドは、最初に検出された時点で、検索済み別名になります。

–k

コマンド名に先行するものだけでなく、すべての変数代入引数をコマンドの環境に格納します。

–m

バックグラウンドジョブを個別のプロセスグループで実行し、完了時にメッセージを 1 行表示します。バックグラウンドジョブの終了ステータスは 完了メッセージで報告されます。ジョブ制御を備えたシステムでは、このフラグは対話型シェルに対して自動的に有効になります。

–n

コマンドを読み取り、構文エラーがないかチェックします。実行は行いません。対話型シェルに対しては無視されます。

–o

現在のオプション設定を標準出力に書き出します。コマンドとしてシェルに再入力できる形式で書き込まれるため、同じオプション設定を再現するときに便利です。

–o

このフラグのあとに指定する引数は、次のいずれかのオプション名です。

allexport

–a と同じです。

errexit

–e と同じです。

bgnice

バックグラウンドジョブをすべて低い優先度で実行します。これはデフォルトモードです。

emacs

コマンド入力用に、emacs 形式のインラインエディタを起動します。

gmacs

コマンド入力用に、gmacs 形式のインラインエディタを起動します。

ignoreeof

EOF を検出してもシェルは終了しません。終了させるには exit コマンドを使用する必要があります。

keyword

–k と同じです。

markdirs

ファイル名生成によって生成されるディレクトリ名には、すべて最後に / を付加します。

monitor

–m と同じです。

noclobber

リダイレクト演算子「>」によって既存のファイルが上書きされるのを防ぎます。このオプションが有効なときにファイルを切り捨てるには、>| が必要です。–C と同等です。

noexec

–n と同じです。

noglob

–f と同じです。

nolog

履歴ファイルに関数定義を保存しません。

notify

–b と同等です。

nounset

–u と同じです。

privileged

–p と同じです。

verbose

–v と同じです。

trackall

–h と同じです。

vi

vi 形式のインラインエディタの挿入モードになります。033 というエスケープ文字を押すと、これにより制御モードになります。Return で行を送信します。

viraw

各文字を vi モードで入力されたときと同様に処理します。

xtrace

–x と同じです。

オプション名を指定しないと、現在のオプション設定を表示します。

–p

$HOME/.profile ファイルを処理しないようにし、ENV ファイルの代わりに /etc/suid_profile ファイルを使用します。このモードは、実効ユーザー ID が実ユーザー ID と等しくないとき、また実効グループ ID が実グループ ID と等しくないときには必ず有効になります。このモードを無効にすると、実効ユーザー ID が実ユーザー ID に、実効グループ ID が実グループ ID にそれぞれ設定されます。

–s

定位置パラメータを辞書編集方式の順にソートします。

–t

1 つのコマンドを読み取り、実行したあと、終了します。

–u

置換を行う際に、設定されていないパラメータをエラーとして扱います。

–v

シェル入力行の読み取り時に、その内容を表示します。

–x

コマンドの実行時に、コマンドと引数の内容を表示します。

–x フラグと –v フラグを無効にし、フラグに対する引数の検査を停止します。

−−

どのフラグも変更しません。$1 で始まる値に設定する際に便利です。このフラグの後に引数がない場合、定位置パラメータが設定解除されます。

の代わりに + を使用すると、これらのフラグは無効になります。これらのフラグはシェル起動時にも使用できます。現在セットされているフラグは、$– で見つけられます。–A を指定しないかぎり、残りの引数は定位置パラメータとなり、$1 $2 .... に順番に割り当てられます。引数を 1 つも指定しない場合には、すべての変数の名前と値を標準出力上に表示します。

* shift [ n ]

$n+1 $n+1 . . . の定位置パラメータを $1 . . . という名前に変更します。n のデフォルト値は 1 です。パラメータ n に指定できる値は、評価結果が $# 以下の負でない数になる算術式です。

stop%jobid ...
stop pid ...

stop は、jobid (ジョブ ID 番号) を指定するとバックグラウンドジョブの実行を中断し、pid (プロセス ID 番号) を指定するとすべてのプロセスを中断します。ps(1) を参照してください。

suspend

現在のシェルがログインシェルでない場合、その実行を中断します。

test expression

条件式を評価します。使用法と説明については、前述の「条件式」節と test(1) を参照してください。

* times

シェルおよびシェルから実行されたプロセスの、ユーザー時間およびシステム時間の累計値を表示します。

* trap [ arg sig ... ]

arg は、sig が示すシグナルをシェルが受信したときに読み取られ、実行されるコマンドです。arg は、トラップ設定時とトラップ取り出し時に 1 度ずつ検索されます。sig には、シグナル番号またはシグナル名を指定します。trap コマンドは、シグナル番号の順序で実行されます。現在のシェルへの入力時に無視されたシグナル番号にトラップを設定しようとしても無効となります。

arg の場合、シェルは各 sig をデフォルト値に再設定します。arg が NULL ('') の場合、シェルは指定された各 sig が発生してもそれを無視します。それ以外の場合は、対応する sig が 1 つでも発生したときに、arg がシェルによって読み取られ、実行されます。トラップのアクションは、以前のアクション (デフォルトまたは明示的に設定されたもの) より優先して使用されます。トラップのアクションが完了すると、$? の値はトラップが呼び出されたときの値になります。

sig は、EXIT0 (EXIT と同義)、またはシンボル名を使って指定したシグナルから接頭辞 SIG を除いたものです。たとえば HUPINTQUITTERM などです。sig0 または EXIT であり、ある関数の内部で trap 文が実行されると、関数の終了後に arg の示すコマンドが実行されます。sig0 または EXIT であり、関数の外部にトラップが設定されている場合、シェルの終了時に arg の示すコマンドが実行されます。sigERR の場合は、コマンドが 0 以外の終了ステータスで終わると必ず arg が実行されます。sigDEBUG の場合は、各コマンドのあとで arg が実行されます。

シェルが EXIT に対してトラップを実行する環境は、EXIT のトラップを取り出す前に実行された最後のコマンドの直後の環境と同じです。

トラップが呼び出されるたびに、arg 引数は eval "$arg" と同じように処理されます。

非対話型シェルの開始時に無視されたシグナルは、トラップもリセットもできません。ただし、トラップやリセットを試みても、エラーは報告されません。対話型シェルは、呼び出し時に無視されたシグナルをリセットしたりキャッチしたりできます。トラップは、そのシェルの動作中、ほかの trap コマンドにより明示的に変更されるまで有効であり続けます。

サブシェルを起動すると、トラップがデフォルト引数に設定されます。これは、サブシェル内で trap コマンドを使って新しいトラップを設定できないことを意味するものではありません。

引数なしの trap コマンドは、各シグナルに対応したコマンドの一覧を標準出力に書き出します。形式は次のとおりです。

trap −− %s %s ... <arg>, <sig> ...

この出力は、同じトラップ結果をもたらすコマンドとしてシェルに再入力できる形式で書き込まれます (引用も適切に使用されます)。例:

save_traps=$(trap)
. . .
eval "$save_traps"

トラップの名前や番号が正しくないと、ゼロ以外の終了ステータスが返されます。正しければ 0 が返されます。対話型シェルと非対話型シェルのどちらでも、無効なシグナル名やシグナル番号は構文エラーとみなされず、シェルは異常終了しません。

ジョブがフォアグラウンドプロセスを待っている間は、トラップは処理されません。このため、CHLD に対するトラップはフォアグラウンドジョブが終了するまで実行されません。

type name ...

コマンドは、name ごとに、コマンド名として使用される場合にどのように解釈されるかを指示します。

** typeset [ ±HLRZfilrtux[n] ] [ name[=value ] ] ...

シェル変数と関数の属性と値を設定します。関数内で typeset を実行すると、name が示す変数の新しいインスタンスが生成されます。関数が完了すると、その変数の値と型が復元されます。このコマンドには、次の属性を指定できます。

–H

このフラグは UNIX 以外のマシン上で、UNIX とホスト名ファイルとのマッピング情報を提供します。

–L

左詰めを行い、先行するブランクを value から取り除きます。n は、ゼロ以外であればフィールドの幅を定義します。そうでなければ、フィールドの幅は最初に代入される値の幅で決定されます。変数に値を代入したとき、フィールド幅より短ければ右側にブランクが詰められ、長ければ切り捨てられます。–Z フラグも設定されていれば、先行する 0 を削除します。–R フラグは無効になります。

–R

右詰めを行い、先行するブランクを挿入します。n は、0 以外であればフィールドの幅を定義します。0 の場合、フィールドの幅は最初に代入される値の幅で決定されます。変数に値を代入したとき、フィールド幅より短ければ左側にブランクが詰められ、長ければ終端が切り捨てられます。–L フラグは無効になります。

–Z

ブランク以外の最初の文字が数字であり、–L フラグが設定されていない場合は、右詰めを行い、先頭に 0 を詰めます。n は、ゼロ以外であればフィールドの幅を定義します。そうでなければ、フィールドの幅は最初に代入される値の幅で決定されます。

–f

名前は、変数名ではなく関数名を指します。代入は行われません。このフラグとともに指定できるほかのフラグは、–t–u、および –x だけです。–t フラグは、この関数の実行トレースを有効にします。–u フラグは、この関数に「未定義」を示すマークを付けます。関数が参照されると、関数定義を見つけるために FPATH 変数が検索されます。–x フラグを指定すると、 名前で呼び出されるシェル手続き全体で 関数定義が有効になります。

–i

パラメータを整数とします。これにより算術演算が高速化されます。n は、0 以外であればその値を底として定義します。0 の場合、最初の代入で底が決定されます。

–l

大文字をすべて小文字に変換します。大文字への変換を示す –u フラグを無効にします。

–r

指定された name を読み取り専用にします。あとの代入でこれらの名前を変更できないようにします。

–t

変数にタグを付けます。タグはユーザーが定義可能で、シェルに対して特別の意味を持ちません。

–u

小文字をすべて大文字に変換します。小文字への変換を示す –l フラグを無効にします。

–x

指定された name に対し、あとで実行されるコマンドの「環境」へ自動的にエクスポートされるようにマークを付けます。

–i 属性は、–R–L–Z、または –f と同時に指定できません。

の代わりに + を使用すると、これらのフラグは無効になります。name 引数をまったく指定せずにフラグを指定すると、これらのフラグが設定されている変数の名前 (および選択によっては値も) のリストが出力されます。( の代わりに + を使用すると、値は出力されません。) name 引数とフラグを 1 つも指定しないと、すべての変数の名前と属性が表示されます。

ulimit [ –HSacdfnstv ] [ limit ]

リソース制限値を設定または表示します。使用可能なリソース制限値については、次のセクションで説明します。システムによっては、次に挙げたすべての資源の制限を提供していないこともあります。limit を指定すると、指定したリソースの制限値が設定されます。limit の値は、各リソースに指定された単位の数値、または unlimited という値です。文字列 unlimited は、現在の制限値 (ある場合) の削除を要求します。–H フラグと –S フラグは、指定したリソースに対して強い制限と弱い制限のどちらを設定するかを表します。強い制限値は、いったん設定したらあとで値を上げることはできません。弱い制限値は、強い制限値を超えない範囲で値を上げることが可能です。–H–S も省略すると、指定した制限値が強い制限と弱い制限の両方に適用されます。limit 引数を省略すると、現在のリソース制限値が表示されます。このとき、–H が指定された場合を除き、表示されるのは弱い制限値です。複数のリソースを指定すると、値の前に制限値の名前と単位が表示されます。

–a

現在のリソース制限値をすべて表示します。

–c

コアダンプのサイズをブロック (512 バイト) 単位で表します。

–d

データ領域のサイズを K バイト単位で表します。

–f

子プロセスが書き込むファイルのサイズをブロック (512 バイト) 単位で表します。読み込むファイルのサイズに制限はありません。

–n

ファイル記述子数に 1 を加えた値を表します。

–s

スタック領域のサイズを K バイト単位で表します。

–t

各プロセスが使用する秒数を表します。

–v

仮想記憶のサイズを K バイト単位で表します。

オプションをすべて省略すると、–f が指定されたものとみなします。

umask [–S] [ mask ]

ユーザーファイルの作成時のマスクを mask が示す値に設定します (umask(2) を参照)。mask には、chmod(1) で説明する記号値または 8 進数を指定できます。記号値を指定すると、新しい umask 値は、mask を直前の umask 値の補数に適用した結果の補数になります。mask 引数を省略すると、マスクの現在の値を表示します。–S フラグは、シンボリック形式の出力を生成します。

unalias name ...
unalias –a

name のリストで指定された別名を別名リストから削除します。–a オプションは、現在の実行環境からすべての別名定義を削除します。

unset [ –f ] name ...

name が示す変数の設定を解除します。つまり、それらの変数の値と属性を消去します。読み取り専用の変数は設定を解除できません。–f フラグが設定されていると、name 引数は関数名を表します。ERRNOLINENOMAILCHECKOPTARGOPTINDRANDOMSECONDSTMOUT、および _ の設定を解除すると、これらの変数の特殊な意味が削除されます。あとでこれらの変数に値を代入しても、特殊な意味はないままです。

* wait [ job ]

指定された job の終了を待ち、その終了ステータスを報告します。job を指定しないと、現在実行中のすべての子プロセスを待ちます。待つ対象のプロセスの終了ステータスが、このコマンドの終了ステータスになります。job の記述形式については、「ジョブ」を参照してください。

whence [ –pv ] name ...

コマンドは、name ごとに、コマンド名として使用される場合にどのように解釈されるかを指示します。

–v フラグをつけると、より冗長に表示されます。

–p フラグをつけると、コマンド名が別名、関数、または予約語である場合でも name のパスが検索されます。

呼び出し

シェルを exec(2) で呼び出し、0 番目の引数 ($0) の最初の文字が である場合は、シェルをログインシェルとみなし、/etc/profile からコマンドを読み取ります。次に、現在のディレクトリ内に .profile が存在するか、または $HOME/.profile がある場合は、そのいずれかのファイルからコマンドを読み取ります。次に、環境変数 ENV に設定されている値をパラメータ置換することによって指定されるファイルが存在する場合は、そのファイルからコマンドを読み取ります。–s フラグが省略され、arg 引数が指定されている場合は、最初の arg に対してパス検索を実行し、実行するスクリプトの名前を判定します。arg が示すスクリプトには読み取り権が必要で、setuidsetgid の設定は無視されます。パス上でスクリプトが見つからない場合、arg は組み込みコマンドまたは組み込み関数の名前を示しているものとして処理されます。次に、後述の方法でコマンドが読み取られます。シェルを起動すると、次のフラグがシェルによって解釈されます。

–c

command_string オペランドからコマンドを読み取ります。特殊パラメータ 0 の値は、command_name オペランドの値と残りの arg オペランドに含まれる定位置パラメータ ($1$2 など) から順に設定されます。標準入力から読み取られるコマンドはありません。

–s

–s フラグが指定された場合、または引数が残っていない場合は、標準入力からコマンドを読み取ります。前述の特殊コマンドの出力を除くシェル出力は、ファイル記述子 2 に書き込まれます。

–i

–i フラグが指定された場合、またはシェル入出力が端末に接続されている場合 (ioctl(2) を参照)、このシェルは対話型になります。この場合、kill 0 が対話型シェルを終了しないように TERM を無視し、wait が割り込み可能になるように INTR を捕らえ、無視します。いずれの場合も、シェルは QUIT を無視します。

–r

–r フラグを指定すると、シェルは制限付きシェルになります。

他のフラグと引数については、前述の set コマンドの箇所で説明されています。

rksh の特記事項

rksh は、標準シェルより機能が制限されたログイン名や実行環境を設定するために使用します。rksh の機能は、次の動作ができない点を除いて ksh と同じです。

  • ディレクトリの変更 (cd(1) を参照)

  • SHELL、ENV、または PATH の値の設定

  • / を含むパス名またはコマンド名の指定

  • 出力先のリダイレクト (>>|<>、および >>)

  • グループの変更 (newgrp(1) を参照)

前述の制限は、.profile ファイルと ENV ファイルの解釈後に有効となります。

実行するコマンドがシェル手続きである場合、rkshksh を呼び出してコマンドを実行します。したがって、利用できるコマンドの種類には制限はありますが、一般ユーザーは標準シェルの全機能を利用できるシェル手続きを使用することができます。このスキームは、一般ユーザーが同じディレクトリで書き込み権と実行権を持っていないことを想定しています。

これらの規則の実際の効果は、.profile の作成者が確実な設定処理を実行してユーザーを適切な (おそらく、ログインディレクトリ以外の) ディレクトリに置くことにより、ユーザーの動作を完全に制御できるという点にあります。

システム管理者は、多くの場合、rksh で安全に起動できるコマンドのディレクトリ (つまり、/usr/rbin) を設定します。

エラー

構文エラーなどのエラーを検出すると、シェルは 0 以外の終了ステータスを返します。そうでない場合は、シェルは最後に実行されたコマンドの 終了ステータスを返します ( 前述の exit コマンドの説明を参照 ) 。シェルを非対話型で使用している場合、シェルファイルの実行は中止されます。シェルが検出する実行時エラーは、コマンド名または関数名、およびエラー状態を表示することによって報告されます。エラーが発生した行の番号が 1 より大きい場合は、コマンド名または関数名のあとに角括弧 ([]) で囲んだ行番号も表示します。

非対話型シェルの場合は、特殊組み込みユーティリティーやほかの種類のユーティリティーがエラー状態を検出すると、シェルは診断メッセージを書き出し、次の表に示すように終了します。

エラー
特殊組み込みユーティリティー
その他のユーティリティー
シェル言語の構文エラー
終了する
終了する
ユーティリティーの構文エラー (オプションまたはオペランドのエラー)
終了する
終了しない
リダイレクトのエラー
終了する
終了しない
変数代入エラー
終了する
終了しない
展開エラー
終了する
終了する
コマンドが見つからない
該当せず
終了する場合がある
ドットスクリプトが見つからない
終了する
該当せず

展開エラーとは、シェル展開の実行時に発生するエラーです。たとえば、${x!y}! が有効な演算子ではないのでエラーになります。これらのエラーを展開時ではなくトークン化時に検出できる実装では、これらのエラーを構文エラーとして扱うことができます。

前述の表で「終了する」(または「終了する場合がある」) と示されているエラーがサブシェル内で発生した場合、サブシェルはゼロ以外のステータスで終了します (または終了する場合があります) が、サブシェルを含むスクリプトはエラーによって終了しません。

前述の表のどの場合でも、対話型シェルは診断メッセージを標準エラーに書き出すだけで、終了はしません。

使用法

ファイルが 2G バイト (231 バイト) 以上ある場合の kshrksh の動作については、largefile(5) を参照してください。

終了ステータス

各コマンドには、ほかのシェルコマンドの動作に影響を与える可能性のある終了ステータスが定義されています。ユーティリティーを除くコマンドの終了ステータスについては、このセクションで説明します。標準ユーティリティーの終了ステータスについては、対応する各節で説明されています。

コマンドが見つからない場合、終了ステータスは 127 になります。コマンド名は見つかったが実行可能なユーティリティーではない場合、終了ステータスは 126 になります。シェルを使わないでユーティリティーを呼び出すアプリケーションでは、これらの終了ステータス値を使って同様のエラーを報告するようにしてください。

ワードの展開中またはリダイレクション中にコマンドが失敗すると、その終了ステータスはゼロより大きい値になります。

シェルは、特殊パラメータ ? 付きの終了ステータスを報告するときに、利用可能な終了ステータスの 8 ビットすべてを報告します。報告されたシグナルを受け取ったために終了したコマンドの終了ステータスは、128 より大きな値になります。

ファイル

/etc/profile

/etc/suid_profile

$HOME/.profile

/tmp/sh*

/dev/null

属性

属性についての詳細は、マニュアルページの attributes(5) を参照してください。

/usr/sunos/bin/ksh、/usr/sunos/bin/rksh

属性タイプ
属性値
使用条件
shell/ksh88
CSI
有効

/usr/xpg4/bin/sh

属性タイプ
属性値
使用条件
system/core-os
CSI
有効
インタフェースの安定性
確実
標準
standards(5) を参照してください。

関連項目

cat(1), cd(1), chmod(1), cut(1), echo(1), env(1), getoptcvt(1), jobs(1), login(1), newgrp(1), paste(1), pfksh(1), pfexec(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), rand(3C), signal(3C), signal.h(3HEAD), wait(3C), a.out(4), profile(4), attributes(5), environ(5), largefile(5), standards(5)

Morris I. Bolsky、David G. Korn 共著、『The KornShell Command and Programming Language』、Prentice Hall 発行、1989 年。

警告

シェルスクリプトを setuid して使用することは避けてください。

検索済み別名であるコマンドを実行したあとで、検索パスの中で元のコマンドがあるディレクトリよりも前に位置するディレクトリに同じ名前のコマンドがインストールされても、シェルは元のコマンドの方を実行し続けます。新しい方のコマンドを実行するには、alias コマンドの –t オプションを使用してください。

非常に古いシェルスクリプトの中には、パイプ文字 | の同義語として ^ を使用するものがあります。

複合コマンドの中に fc 組み込みコマンドを指定すると、すべてのコマンドが履歴ファイルから削除されます。

.file という組み込みコマンドは、コマンドの実行前にファイル全体を読み取ります。したがって、ファイル内の alias コマンドと unalias コマンドは、ファイル内に定義されたどの関数にも適用されません。

存在しないコマンドのインタプリタを実行しようとするシェルスクリプトを、シェルが処理した場合、シェルはシェルスクリプトが存在しないという間違った診断メッセージを 返します。