11. シェルコマンド
==================================
+シェルコマンド(OSによって実行されるコマンド)は自由に他のコードとミックスすることができます。
+
+.. note::
+ 文法とシェルの使い方はすべてのプラットフォーム(Win32を含む)において同一です。Win32上に移植した場合の問題を避けるために、ネイティブのインタープリター ``cmd`` を使わないことをおすすめします。 ::
+
+ LIB = $(dir lib)
+ println(The contents of the $(LIB) directory is:)
+ ls $(LIB)
.. _label11.1:
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
.. _label11.2:
11.2 検索
----------------------------------
+コマンドにはワイルドカードパターンを含めることができます。パターンには制限された正規表現を用いたファイルの集合を指定します。パターンは関数が実行される前に展開されます。 ::
+
+ # .c 拡張子のファイルをすべてリスト
+ ls *.c
+
+ # 1文字の接頭辞と.cの拡張子を持ったすべてのファイルをリスト
+ ls ?.c
+\13
+ # hello.mlファイルをfoo.mlにリネーム
+ mv {hello,foo}.ml
+
+Omakeのglobパターンのさらなる説明は10.4で与えられます。
.. _label11.3:
11.3 バックグラウンドでのジョブ
----------------------------------
+コマンドはまたアンパサンド&をコマンドの後に付与することで、バックグラウンド上で実行されます。ユーザへの制御は、ジョブが完了するまで待つことなく返されます。ジョブはバックグラウンド上で走り続けます。 ::
+
+ gcc -o hugeprogram *.c &
.. index::
single: ファイルのリダイレクション
11.4 ファイルのリダイレクション
----------------------------------
+入力と出力は ``<`` , ``>`` , ``>&`` をコマンドの後に付与することによって、ファイルにリダイレクトすることができます。 ::
+
+ # "foo" ファイルに書き込み
+ echo Hello world > foo
+
+ # fooファイルからの入力をリダイレクト
+ cat < foo
+
+ # 標準出力、標準エラーをfooファイルにリダイレクト
+ gcc -o boo *.c >& foo
.. index::
single: パイプライン
11.5 パイプライン
----------------------------------
+パイプラインはコマンドのシーケンスで、各々のコマンドの出力は次のコマンドへ送られます。パイプは ``|`` と ``|&`` で定義されます。 ``|`` は出力はリダイレクトされますが、エラーはされません。 ``|&`` は出力とエラーの両方がリダイレクトされます。 ::
+
+ # lsコマンドの出力をプリンターに送る
+ ls *.c | lpr
+
+ # 出力とエラーをEメールを使ってjyhに送る
+ gcc -o hugefile *.c |& mail jyh
.. index::
- single: 条件による実行
+ single: 実行の条件分岐
.. _label11.6:
-11.6 条件による実行
+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"
.. index::
single: グループ化
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"
.. _label11.8:
11.8 シェルコマンドとは何か?
----------------------------------
+文法的には、シェルコマンドは以下のうち一つも該当していない任意の行を指します。
+
+* ``VAR=string`` の形の変数定義
+* 関数の呼び出し ``f(...)`` かメソッドの呼び出し ``o.f(...)``
+* コロン:を含んだルールの定義 ``string: ...``
+* 以下のリストを含む特殊コマンド
+ * ``if ...``
+ * ``switch ...``
+ * ``match ...``
+ * ``section ...``
+ * ``return ...``
+
+コマンドはまたビルドイン(エイリアス)でもあります。さらなる情報はShellオブジェクトのドキュメントを参照してください。
.. _label11.9: