1. bash の基礎 |
↑ 目次へ戻る | 「2.コマンドライン編集」へ進む --> |
1.1 bash とは1.3 入力と出力
1.4 コントロールキー
1.1 bash とはbash ( Bourne Again Shell ) は GNU システム用の標準シェルとして開発されたものである.1.2 ファイル名/ディレクトリ名等の展開
その名前からも分かるように,Bourne シェルとの互換性をもつ一つの B シェル系のシェルである.
また,C シェルや Korn シェル (これは Bourne シェルと C シェルのもっとも優れた機能 + α の商用プロダクト) で見られる優れた機能を取り入れており,さらにいくつかの優位性をも備えている.
- チルダ( ~ )展開
例として /home/taro 以下にある foo.txt というファイルの内容をのぞくことを考える.
当然,フルパスで% cat /home/taro/foo.txtと入力すればその内容が標準出力(おそらく kterm 上)に表示されるが,% cat ~taro/foo.txtとしても全く同じである. また,自分がこのユーザ taro の場合は,% ~/foo.txtでよい.
- ワイルドカード
ワイルドカードとはいろいろなパターンに置換されることを期待された特殊文字のことである.
bash で利用できる基本的なワイルドカードには次のようなものがある:
ワイルドカード 一致対象 ? 任意の一文字 * 任意の文字列 [set] set の中のいずれかの文字 [!set] set の中のいずれでもない文字 (例)カレントディレクトリに foo.c , foo.h , foo.java , foo.o という4つのファイルが存在している場合:
% ls foo.? (※foo.任意の一文字 ) foo.c foo.h foo.o % ls foo.* (※foo.任意の文字列) foo.c foo.h foo.java foo.o % ls foo.[ch] (※foo.ch のいずれかの文字) foo.c foo.h % ls foo.[!ch] (※foo.chのいずれでもない文字) foo.o % ls foo.[!ch]* (※foo.chのいずれでもない文字任意の文字列) foo.java foo.o
セット構造ワイルドカードの使用例 式 一致対象 [abc] a, b, c のいずれか [.,;] ピリオド,コンマ,セミコロンのいずれか [-_] ダッシュあるいはアンダースコア [a-c] a, b, c のいずれか [a-z] 小文字のアルファベットすべて [!0-9] 0 から 9 以外の文字 [0-9!] 0 から 9 までの数字とエクスクラメーション [a-zA-Z] 小文字と大文字のアルファベットすべて [a-zA-Z0-9_-] すべてのアルファベット,数字,アンダースコア,ダッシュ
- ブレース( { } )展開
セット構造ワイルドカードではある 1 文字との一致が可能であるが, 文字列との一致は実現できない.その場合,このブレース展開を用いる. ブレース,つまり { } で一致させたいパターン列を囲んで表現する.
(例) 上記の例の場合:
% ls foo.{c,java} foo.c foo.java(注意)カンマやブレースの前後に スペースを入れてはならない!
- 標準入出力
UNIX のプログラムには標準入力,標準出力, 標準エラー出力の 3 つの入出力機能が備わっている.
例えば C のプログラムにおいて, scanf 関数は標準入力からデータを取り込み, printf 関数は標準出力へデータを出力している. 標準エラー出力の場合,標準出力と同じように kterm 等に出力されるため, 一見何も変わらないように見えるが,フィルタを通すとその違いが分か る. C のプログラムでは fprintf 関数等を用いて標準エラー出力への出力を実現できる.
データをフィルタリングする一般的な UNIX ユーティリティ ユーティリティ 目的 cat 入力を出力にコピーする grep 入力に対し文字列を検索する sort 入力に対し行を並べ替える cut 入力から列を取り出す sed 入力に対し編集操作を実行する tr 入力に対し文字を他の文字に置換する (例)cat を使って標準入力を標準出力へコピーする:
% cat foo foo foo foo foo foo ^D下線部がキーボードからの入力,つまり標準入力であり, その下に表示されているのが標準出力である.
^D は CTRL-D であり終端を意味する.
- 入出力リダイレクション
上記の標準入出力は何らかのファイルに置き換えることもできる.
リダイレクション記号 意味 使用方法 < 標準入力の代わり command < input_file > 標準出力の代わり command > output_file >& 標準出力+エラー出力の代わり command >& output_file 例えば上の cat を使った例で,出力を標準出力から bar.txt というファイルに置き換えて使うと:
となる.
% cat > bar.txt foo foo foo ^D
同様に,とすると,cp foo.txt bar.txt と同じ働きをする.
% cat < foo.txt > bar.txt
- パイプライン
コマンドの標準出力をファイルではなく別のコマンドの標準入力にすることをパイプという.
ちょうどデータの流れを水の流れに例えると, あるコマンドの排水口(標準出力)から出た水(出力したデータ) を別のコマンドの注水口(標準入力)へそのまま送るために, 2つの間をパイプラインでつなぐといったイメージである.最も頻繁に利用される処理の一つとして,各種のコマンドの出力を more や less にパイプでつなぐことが挙げられる:
こうすると,多くのバイナリファイルが /usr/bin に含まれていても,そのまま標準出力にたれ流しされることはなく, more コマンドによって一画面分ずつ順に表示される.(ちなみに less はもっと高度なことができる.詳しくはマニュアル参照. )
% ls /usr/bin | more他にも
とすると,自分のホームディレクトリ以下に core ファイルがあれば,そのパスが表示される. (find は指定されたディレクトリ以下のファイルとディレクトリを全て 標準出力,この場合はパイプライン処理により grep の入力 に表示する. そして,それを受け取った grep が指定されたパターン core にマッチしたものを標準出力に表示する.)
% find ~ | grep coreもう少し高度な使い方として, 現在使用しているホストのユーザリストを印刷する一手法
を紹介しよう.
% cut -d: -f1 < /etc/passwd | sort | lpr
まず最初にリダイレクションによって /etc/passwd ファイルの内容が cut コマンドの標準入力の代わりとして利用される. cut コマンドは入力から列を取り出す(上の表を参照)もので,-d オプションは区切り文字, -f オプションはフィールドの位置をそれぞれ指定 するものである.この場合,区切り文字はコロン(:),フィールドの位置は 1 (先頭)であるので /etc/passwd ファイル中の最初の : までの文字列 (ユーザ名)が各行毎に切り出されて出力される. これはアルファベット順に並んでいるわけではないので,sort コマンドへパイプで流して整列させ,さらにその結果を lpr コマンドに流して 直接プリントアウトする.こうすると一切途中に作業ファイルを設けることなく 目的のリストを印刷することができる.
- バックグラウンドにおける入出力
コマンドに & を付けて実行した場合, それはバックグラウンドジョブとして処理される.つまり,kterm 等の上でのユーザとの対話的な実行ではなく, 背後での沈黙した実行や別ウィンドウでの独立した実行を期待されるものである. この場合もバックグラウンドジョブからの出力は標準出力へと送られるため, 場合によっては複数のジョブからの出力が画面上に入り乱れてしまうこともある. そのためリダイレクション機能を用いて, バックグラウンドジョブからの出力を別ファイルに送るのが賢明である.
% command > output_file &バックグラウンドジョブの優先度を上げて早めに実行を終らせることも 場合によっては可能である.詳しくは nice コマンドのマニュアルを参考にして欲しい.
詳しくは後述するが, stty コマンドでコントロールキーは管理されており, 自分の設定がどうなっているかはとすればよい. すると
% stty -aといった出力が得られる. 例えば,上で色をつけて示した intr = ^C は, コマンドの中止が CTRL-C に割り当てられていることを意味している. 主なものをまとめておく.
speed 9600 baud; rows 24; columns 80; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <未定義>; eol2 = <未定義>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; .................
コントロールキー stty 名 機能定義 CTRL-C intr 現在のコマンドを中止する CTRL-D eof 入力の終り CTRL-\ quit CTRL-C が機能しなかった場合に現在のコマンドを中止する CTRL-S stop 画面への出力を停止する CTRL-Q start 画面への出力を再開する DEL または CTRL-? erase 最後の文字を削除する CTRL-U kill コマンドライン全体を削除する CTRL-Z susp 現在のコマンドを一時停止する よく陥りやすいミスとして,Emacs で作業中に CTRL-x CTRL-s でファイルをセーブしたつもりが, マウスポインタが kterm 上に位置していて,上記の CTRL-s ,つまり画面出力の停止を指示してしまい, kterm がフリーズしたと勘違いしてしまうことがある. その時は慌てずに CTRL-q で画面出力を再開すればよい.
Copyright (C) 1999-2000 Hirohisa AMAN <aman (AT) computer.org>