11. シェルコマンド

シェルコマンド(OSによって実行されるコマンド)は自由に他のコードとミックスすることができます。

ノート

構文とシェルの使い方はすべてのプラットフォーム(Win32を含む)において同一です。Win32上に移植した場合の問題を避けるために、ネイティブのインタープリター cmd を使わないことをおすすめします。

LIB = $(dir lib)
println(The contents of the $(LIB) directory is:)
ls $(LIB)

11.1 簡単なコマンド

シェルコマンドの構文はUnixシェル bash を使うときの構文と似ています。 通常、コマンドは パイプライン となっています。通常のコマンドはパイプラインの一部です。コマンドを実行するためには、実行可能なコマンド名といくつかの引数を指定する必要があります。以下はいくつかの例です。

ls
ls -AF .
echo Hello world

コマンドは実行可能コマンドが格納されているディレクトリの配列 PATH[] 変数の値を用いて探します。

コマンドは環境変数の定義によって修正されることがあります。

# "Hello world" と出力
env X="Hello world" Y=2 printenv X
# Visual C++ のインクルードパスを検索
env include="c:\Program Files\Microsoft SDK\include" cl foo.cpp

11.2 検索

コマンドにはワイルドカードパターンを含めることができます。パターンには制限された正規表現を用いたファイルの集合を指定します。パターンは関数が実行される前に展開されます。

# .c 拡張子のファイルをすべてリスト
ls *.c

# 1文字の接頭辞と.cの拡張子を持ったすべてのファイルをリスト
ls ?.c

# hello.mlファイルをfoo.mlにリネーム
mv {hello,foo}.ml

OMakeのglobパターンのさらなる説明は “10.4 ファイルの検索とリスト” で与えられます。

11.3 バックグラウンドでのジョブ

コマンドはまたアンパサンド & をコマンドの後に付与することで、バックグラウンド上で実行されます。ユーザへの制御は、ジョブが完了するまで待つことなく返されます。ジョブはバックグラウンド上で走り続けます。

gcc -o hugeprogram *.c &

11.4 ファイルのリダイレクション

入力と出力は < , > , >& をコマンドの後に付与することによって、ファイルにリダイレクトすることができます。

# "foo" ファイルに書き込み
echo Hello world > foo

# fooファイルからの入力をリダイレクト
cat < foo

# 標準出力、標準エラーをfooファイルにリダイレクト
gcc -o boo *.c >& foo

11.5 パイプライン

パイプラインはコマンドのシーケンスで、各々のコマンドの出力は次のコマンドへ送られます。パイプは ||& で定義されます。 | は出力はリダイレクトされますが、エラーはされません。 |& は出力とエラーの両方がリダイレクトされます。

# lsコマンドの出力をプリンターに送る
ls *.c | lpr

# 出力とエラーをEメールを使ってjyhに送る
gcc -o hugefile *.c |& mail jyh

11.6 条件分岐の実行

コマンドは ||&& の条件分岐を使うことで複雑に組み合わせることができます。すべてのコマンドは0か他の整数の終了コードを返します。コマンドは終了コードが0であった場合、成功したと宣言します。式 command1 && command2 は、 command1 が成功した場合のみ command2 が実行されます。式 command1 || command2 は、 command1 が失敗した場合のみ command2 が実行されます。

# 可能な場合のみx/yファイルを表示する
cd x && cat y

# foo.exeを実行するか、エラーメッセージを表示する
(test -x foo.exe && foo.exe) || echo "foo.exe is not executable"

11.7 グループ化

パイプラインをグループ化したり、条件分岐をさせる場合には括弧を使います。以下の式では、 test 関数は foo.exe ファイルが実行可能であるかどうか試し、もしそうであったのなら、 foo.exe ファイルが実行されます。もし実行可能でなかったのなら(あるいは foo.exe コマンドが失敗したのなら)、メッセージ "foo.exe is not executable" が表示されます。

# foo.exeを実行するか、エラーメッセージを表示する
(test -x foo.exe && foo.exe) || echo "foo.exe is not executable"

11.8 シェルコマンドとは何か?

構文的には、シェルコマンドは以下のうち一つも該当していない任意の行を指します。

  • VAR=string の形の変数定義

  • 関数の呼び出し f(...) かメソッドの呼び出し o.f(...)

  • コロン:を含んだルールの定義 string: ...

  • 以下のリストを含む特殊コマンド
    • if ...
    • switch ...
    • match ...
    • section ...
    • return ...

コマンドはまたビルドイン(エイリアス)でもあります。さらなる情報は “12.1.22 Shell” を参照してください。

11.9 基本的なビルドイン関数

11.9.1 echo

echo 関数は文字列を表示します。

$(echo <args>)
echo <args>

11.9.2 cd

cd 関数はカレントディレクトリを変更します。

cd(dir)
   dir : Dir

cd 関数は2つの引数を取ることもできます。

$(cd dir, e)
   dir : Dir
   e : expression

2つ引数を取る形では、式 e がディレクトリ dir 上で評価されます。カレントディレクトリは変更されません。

cd 関数のふるまいはディレクトリの検索パスを指定している CDPATH 変数を用いて変更できます。これは通常、oshコマンドインタープリタ上でのみ有効です。

CDPATH : Dir Sequence

例えば、以下の式ではディレクトリを最初のディレクトリ ./foo , ~/dir1/foo , ~/dir2/foo に変更します。

CDPATH[] =
   .
   $(HOME)/dir1
   $(HOME)/dir2
cd foo

11.10 ジョブを制御するビルドイン関数

11.10.1 jobs

jobs 関数はジョブのリストを表示します。

jobs

11.10.2 bg

bg 関数はバックグラウンド上にジョブを配置します。

bg <pid...>

11.10.3 fg

fg 関数はジョブをフォアグラウンドに持っていきます。

fg <pid...>

11.10.4 stop

stop 関数はジョブを停止(suspends)します。

stop <pid...>

11.10.5 wait

wait 関数はジョブが完了するまで待機します。プロセス固有の値が指定されなかった場合、シェルはすべてのジョブが完了するまで待機します。

wait <pid...>

11.10.6 kill

kill 関数はジョブにシグナルを送ります。

kill [signal] <pid...>

11.11 コマンド履歴

11.11.1 history

$(history-index) : Int
$(history) : String Sequence
history-file : File
history-length : Int

ヒストリ変数はosh上のコマンドライン履歴を管理します。これらの変数はomakeに影響を及ぼしません。

history-index 変数はコマンドライン履歴における、現在のインデックスを表します。 history 変数は現在のコマンドライン履歴を表します。

コマンドライン履歴を保存したいと思った場合、あなたは history-file 変数を再定義することができます。デフォルトの値は ~/.omake/osh_history です。

コマンドライン履歴の行数の最大値を指定したい場合、あなたは history-length 変数を再定義することができます。デフォルトの値は 100 です。