Bash Basics | Basicsトップページ | トップページ

コマンドの形式

単純なコマンドはシェルの文法で示したように変数の代入とコマンド名とそれに続く引き数リスト(引き数リストは省略可能)を指定して記述します。
指定可能な引き数はそれぞれのコマンドで定義されており、オプションと呼ばれるコマンドの動作を変える指定を行うことができるものもあります。


終了ステータス

シェルから実行されるコマンドや関数は終了する際に0から255までの整数値を返すことができ、呼び出し元に返されるこの値を終了ステータスと言います。
シェルは終了ステータスが0の場合、正常終了とみなし、0以外の場合をエラーや失敗とみなします。
コマンドや関数によっては正常終了でも0以外を返すものがあるため、詳細はそれぞれのコマンドや関数のマニュアルページなどを確認してください。
シェル内では変数$?を参照することで直前に実行されたコマンドや関数の終了ステータスを確認することが可能です。
コマンドがシグナルを受信してデフォルトの挙動として終了した場合には、受信したシグナル番号 + 128の終了ステータスとなります。
コマンドが見つからなかった場合には、終了ステータスとして127が返されます。コマンドが見つかったにもかかわらず(権限エラーなどで)実行できなかった場合には、終了ステータスとして126が返されます。
展開やリダイレクションの際にエラーが発生し、コマンドの実行が失敗した場合には、0より大きい終了ステータスが返されます。
組み込みコマンドは実行が正常に終了した場合には、終了ステータスとして0を返し、実行中にエラーが発生した場合には、終了ステータスとして0以外を返します。また、正しくない使い方をしようとした場合には、終了ステータスとして2を返します。


exitとreturn

シェルを終了する組み込みコマンドとしてexitを呼び出すことで明示的に終了ステータスを指定することが可能です。
関数を終了する場合には、exitではなくreturnを使用します。
sourceコマンドで現在のシェルに読み込まれるスクリプトを終了する場合には、returnを呼び出すことで終了ステータスを指定して呼び出した現在のシェルに戻ることが可能です。sourceコマンドで呼び出されたスクリプト内でexitが呼び出されると現在のシェルごと終了します。


ドキュメント

Linuxではコマンドなどの動作や引き数を説明する二種類のドキュメントがあります。

  • マニュアルページ
    マニュアルページは、複数の言語で用意されていることが多く、現在のシェルのロケールに従って表示する言語を切り替えることが可能です。指定されたロケールのマニュアルページが存在しない場合には、デフォルトの英語のマニュアルページが表示されます。
    マニュアルページはmanコマンドを使用し、引き数として参照したいコマンド名を指定します。manコマンド自身の説明を参照する場合にはman manと入力します。
    特定の言語のマニュアルページを参照したい場合にはLANG=<言語名> manのようにコマンドの直前でシェル変数LANGに参照する言語を指定し、スペースのあとにコマンドを指定します。

    実行例:

    ロケールがja_JP.UTF-8の場合:
    $ man man
    MAN(1)                 マニュアルページユーティリティー                 MAN(1)
    
    名前
           man - オンラインマニュアルのインターフェース
    
    書式
           man  [-C  file]  [-d]  [-D]  [--warnings[=warnings]]  [-R encoding] [-L
           locale] [-m system[,...]] [-M path] [-S list]  [-e  extension]  [-i|-I]
           [--regex|--wildcard]   [--names-only]  [-a]  [-u]  [--no-subpages]  [-P
           pager] [-r prompt] [-7] [-E encoding] [--no-hyphenation] [--no-justifi‐
           cation]  [-p  string]  [-t]  [-T[device]]  [-H[browser]] [-X[dpi]] [-Z]
           [[section] page ...] ...
           man -k [apropos options] regexp ...
           man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ...
           man -f [whatis options] page ...
           man -l [-C file] [-d] [-D] [--warnings[=warnings]]  [-R  encoding]  [-L
           locale]  [-P  pager]  [-r  prompt]  [-7] [-E encoding] [-p string] [-t]
           [-T[device]] [-H[browser]] [-X[dpi]] [-Z] file ...
           man -w|-W [-C file] [-d] [-D] page ...
           man -c [-C file] [-d] [-D] page ...
           man [-?V]
    
    説明
    Manual page man(1) line 1 (press h for help or q to quit)
    

    POSIXロケールとも呼ばれるシステムのデフォルトのCロケールの場合:
    $ LANG=C man man
    MAN(1)                        Manual pager utils                        MAN(1)
    
    NAME
           man - an interface to the on-line reference manuals
    
    SYNOPSIS
           man  [-C  file]  [-d]  [-D]  [--warnings[=warnings]]  [-R encoding] [-L
           locale] [-m system[,...]] [-M path] [-S list]  [-e  extension]  [-i|-I]
           [--regex|--wildcard]   [--names-only]  [-a]  [-u]  [--no-subpages]  [-P
           pager] [-r prompt] [-7] [-E encoding] [--no-hyphenation] [--no-justifi‐
           cation]  [-p  string]  [-t]  [-T[device]]  [-H[browser]] [-X[dpi]] [-Z]
           [[section] page ...] ...
           man -k [apropos options] regexp ...
           man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ...
           man -f [whatis options] page ...
           man -l [-C file] [-d] [-D] [--warnings[=warnings]]  [-R  encoding]  [-L
           locale]  [-P  pager]  [-r  prompt]  [-7] [-E encoding] [-p string] [-t]
           [-T[device]] [-H[browser]] [-X[dpi]] [-Z] file ...
           man -w|-W [-C file] [-d] [-D] page ...
           man -c [-C file] [-d] [-D] page ...
           man [-?V]
    
    DESCRIPTION
    Manual page man(1) line 1 (press h for help or q to quit)
    

    マニュアルページはコマンドだけではなく、OSが提供するシステムコールやライブラリなど多くのマニュアルを提供しています。マニュアルはセクションごとに管理されており、以下の表はセクションの一覧です。
    セクション含まれる内容
    1実行プログラムまたは、シェルコマンド
    2システムコール
    3ライブラリ
    4特殊ファイル、デバイスファイル
    5ファイルの書式
    6ゲーム、スクリーンセーバー
    7その他
    8システム管理コマンド

    異るセクションに同名のマニュアルページが存在する場合、manコマンドで明示的にセクションを明示的に指定しなかった場合、最初に見つかったマニュアルページが表示されます。

    セクション2のexitシステムコールのマニュアルページを表示する例:
    $ man 2 exit
    _EXIT(2)                   Linux Programmer's Manual                  _EXIT(2)
    
    名前
           _exit, _Exit - 呼び出し元のプロセスを終了させる
    
    書式
           #include 
    
           void _exit(int status);
    
           #include 
    
           void _Exit(int status);
    
       glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):
    
           _Exit():
               _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE ||
               _POSIX_C_SOURCE >= 200112L;
               または cc -std=c99
    
    説明
           _exit()                は、それを呼んだプロセスを「直ちに」終了させる。
           その際、このプロセスが所有しているディスクリプタ    (descriptor)   で、
           オープンされているものは全てクローズされる。
           また、このプロセスが所有する子プロセスは全て、プロセス番号  1、  つまり
           init プロセスによって継承され、このプロセスの親プロセスに対して SIGCHLD
           シグナルが送出される。
    
           status
           の値は、このプロセスの終了状態としてその親プロセスに対して返され、
           wait(2) 系関数を利用することによって取得することができる。
    
           関数 _Exit()  は _exit()  と等価である。
    
    返り値
           これらの関数は値を返さない。
    
    準拠
           SVr4, POSIX.1-2001, 4.3BSD.  関数 _Exit()  は C99 で導入された。
    
    注意
           exit       の効果、終了状態の受渡し、ゾンビプロセス、シグナル送出などに
           ついての議論は、 exit(3) を参照すること。
    
           関数  _exit()   は  exit(3)   に似ているが、ANSI  C  の  atexit(3)   や
           on_exit(3)   によって登録されたいかなる関数も呼び出さない。   標準  I/O
           バッファのフラッシュや、                                     tmpfile(3)
           で作成されたテンポラリファイルの削除を行うかどうかは、実装に依存する。
           一方で、                                                        _exit()
           はオープンされているファイルディスクリプタをクローズしないため、
           未決定になっている出力がフラッシュされるのを待つのに不確定な遅れが発生す
    る。
           この遅れを発生させたくなければ、     _exit()      の前に     tcflush(3)
           のような関数を呼び出せばよい。      _exit()      が呼び出された時に、
           未決定になっている全ての   I/O  がキャンセルされるのか、  またどの  I/O
           がキャンセルされるのかは実装に依存する。
    
           バージョン      2.3      より前の      glibc       では、       _exit()
           のラッパー関数は同じ名前のカーネル・システムコールを起動していた。
           glibc    2.3     以降では、プロセス内の全てのスレッドを終了するために、
           ラッパー関数は exit_group(2)  を起動する。
    
    関連項目
           execve(2),  exit_group(2),  fork(2),  kill(2), wait(2), wait4(2), wait‐
           pid(2), atexit(3), exit(3), on_exit(3), termios(3)
    
    この文書について
           この man ページは Linux man-pages  プロジェクトのリリース  3.51  の一部
           である。プロジェクトの説明とバグ報告に関する情報は      http://www.ker‐
           nel.org/doc/man-pages/ に書かれている。
    
    Linux                             2010-09-20                          _EXIT(2)
    

    セクション3のexitコマンドのマニュアルページを表示する例:
    $ man 3 exit
    EXIT(3)                    Linux Programmer's Manual                   EXIT(3)
    
    名前
           exit - プロセスの正常終了
    
    書式
           #include 
    
           void exit(int status);
    
    説明
           exit()      関数は、プロセスを正常に終了させ、     status     &    0377
           という値を親プロセスへ返す (wait(2) を参照)。
    
           atexit(3)              や             on_exit(3)               によって
           登録された全ての関数は、それらが登録された順番と逆順にコールされる。
           (登録された関数の中で   atexit(3)    or   on_exit(3)    を使って   exit
           処理中に実行される追加の関数を登録することができる;
           新規に登録された関数は、この後で実行される関数リストの先頭に
           追加される。)  これらの関数の一つが返らなかった場合 (例えば、その関数が
           _exit(2)    を呼び出したり、シグナルで自分自身を    kill    した場合)、
           残りの関数はどれも呼び出されず、それ以降の  exit  処理  (特に  stdio(3)
           ストリームのフラッシュなど)  は中止される。  ある関数が  atexit(3)   や
           on_exit(3)                           を使って複数回登録されていた場合、
           その関数は登録されたのと同じ回数だけ呼び出される。
    
           オープン中の                                                   stdio(3)
           ストリームは全てフラッシュされて、クローズされる。           tmpfile(3)
           によって作成されたファイルは削除される。
    
           C   標準では   EXIT_SUCCESS   と   EXIT_FAILURE   という    2つの定数が
           定義されている。それぞれ正常終了と異常終了を示すもので、         exit()
           として渡すことができる。
    
    返り値
           exit()  関数は返らない。
    
    準拠
           SVr4, 4.3BSD, POSIX.1-2001, C89, C99.
    
    注意
           atexit(3)   や  on_exit(3)   を使って登録された関数の中で   exit()   か
           longjmp(3)  が呼び出された場合、 何が起こるかは未定義である。 execve(2)
           を呼び出すと、            atexit(3)            や            on_exit(3)
           を使って登録された関数が削除される点に注意すること。
    
           EXIT_SUCCESS  と  EXIT_FAILURE  を使うと、0  や  (1  や  -1 といった) 0
           以外の値を使うのに比べて              (UNIX               以外の環境に)
           移植するのがいくらか簡単になる。 特に VMS は別の方式を用いている。
    
           BSD は終了コードを標準化しようとしている;  を参照すること。
    
           exit()       の後、親プロセスに終了ステータスが渡されなければならない。
           終了ステータスの渡し方には 3 つの場合がある。 親プロセスが SA_NOCLDWAIT
           を設定した場合、  または  SIGCHLD  ハンドラを  SIG_IGN に設定した場合、
           ステータスは破棄される。 親プロセスが子プロセスの終了を待っている場合、
           親プロセスに終了ステータスが伝えられる。      どちらの場合でも     exit
           のプロセスは直ちに終了する。 「終了ステータスを関知せず終了も待たない」
           ということを親プロセスが指示していない場合、       exit      プロセスは
           (終了ステータスを表す              1              バイトのみを保持する)
           「ゾンビ」プロセスになる。          これにより、後から          wait(2)
           関数を呼び出すことで、 親プロセスは終了ステータスを知ることができる。
    
           SIGCHLD                        シグナルのサポートが実装されている場合、
           このシグナルは親プロセスに送られる。      親プロセスが     SA_NOCLDWAIT
           を設定した場合、 SIGCHLD シグナルが送られるかどうかは定義されていない。
    
           そのプロセスがセッションのリーダーで、
           そのプロセスの制御端末がそのセッションの制御端末である場合、
           この制御端末のフォアグラウンドプロセスグループにある       各プロセスに
           SIGHUP             シグナルが送られ、端末がセッションから切り離される。
           これにより新しい制御プロセスを取得することができる。
    
           プロセスが終了することにより、プロセスグループが孤立して、
           そのグループのメンバーのうちのどれかが停止した場合、
           プロセスグループの各プロセスに対して  SIGHUP   シグナルが送られ、続いて
           SIGCONT         シグナルが送られる。         孤立した        (orphaned)
           プロセスグループの説明は setpgid(2)  を参照。
    
    関連項目
           _exit(2), setpgid(2), wait(2), atexit(3), on_exit(3), tmpfile(3)
    
    この文書について
           この man ページは Linux man-pages  プロジェクトのリリース  3.51  の一部
           である。プロジェクトの説明とバグ報告に関する情報は      http://www.ker‐
           nel.org/doc/man-pages/ に書かれている。
    
    Linux                             2013-02-14                           EXIT(3)
    
  • Infoドキュメント
    Linuxのパッケージにはマニュアルの他にInfoドキュメントと呼ばれるパッケージに関する様々な情報を記述したドキュメントが提供されていることがあります。
    Infoドキュメントはinfoコマンドで参照することができます。
    引き数なしでinfoコマンドを実行するとツリー構造のInfoドキュメントのトップレベル(最上位)のドキュメントを表示します。
    Infoドキュメントはカーソルキーなどで操作することが可能となっており、キーワードで検索したい場合には、/キーを入力し、続けて検索したい文字列を正規表現で入力します。
    参照したいドキュメントが見つかったらカーソルを合わせてEnterキーを入力することでそのドキュメントに移動することができます。
    トップレベルのドキュメントに戻る場合はDキーを入力します。

    $ info
    File: dir       Node: Top       This is the top of the INFO tree
    
      This (the Directory node) gives a menu of major topics. 
      Typing "q" exits, "?" lists all Info commands, "d" returns here,
      "h" gives a primer for first-timers,
      "mEmacs" visits the Emacs topic, etc.
    
      In Emacs, you can click mouse button 2 on a menu item or cross reference
      to select it.
    
    * Menu: 
    
    Archiving
    * Cpio: (cpio).                 Copy-in-copy-out archiver to tape or disk.
    * Tar: (tar).                   Making tape (or disk) archives.
    
    Basics
    * Common options: (coreutils)Common options.
    * Coreutils: (coreutils).       Core GNU (file, text, shell) utilities.
    * Date input formats: (coreutils)Date input formats.
    * File permissions: (coreutils)File permissions.
                                    Access modes.
    -----Info: (dir)Top, 2048 lines --Top-------------------------------------------
    Welcome to Info version 5.1. Type h for help, m for menu item.
    
    /bashと入力して、"bash"を検索した状態
    検索した結果が画面中央に表示されます
    
    System administration
    * Which: (which).               Show full path of commands.
    * parted: (parted).             GNU partitioning software
    
    Texinfo documentation system
    * Info: (info).                 Documentation browsing system.
    * Pinfo: (pinfo).               curses based lynx-style info browser.
    
    Miscellaneous
    * bash: (bash).                 The Bourne Again Shell.
    * bc: (bc).                     The GNU calculator language.
    * dc: (dc).                     The GNU RPN calculator.
    * time: (time).                 GNU time Utility
    
    Text creation and manipulation
    * Diffutils: (diffutils).       Comparing and merging files.
    * Gawk: (gawk).                 A text scanning and processing language.
    * grep: (grep).                 Print lines matching a pattern.
    * sed: (sed).                   Stream EDitor.  
    
    Utilities
    -----Info: (dir)Top, 2048 lines --98%-------------------------------------------
    
    

bashの組み込みコマンドについてはhelpコマンドで参照することが可能です。
manコマンドもinfoコマンドも外部コマンドです。