入門 bash 読書ノート 1/3¶
- 著者:
Cameron Newham, Bill Rosenblatt
- 訳者:
株式会社クイープ
- 出版社:
オライリー・ジャパン
- 発行年:
2005 年
- ISBN:
978-4-87311-254-1
まえがき¶
echo $BASH_VERSION
で使用している bash のバージョンを確認できる。(p. v)今手許の環境を調べたら
3.2.48(21)-release
と出た。
本書の想定読者は「初心者」の次の段階に位置する一般的な UNIX/Linux ユーザー。(p. vi)
本書の狙いは、実用的なシェルプログラムを作成するためにコンピュータの学位を取得する必要はないことを示すことにある。(p. vii)
RUBOUT: rub out を辞書で調べると、「すり消す」とある。
<本書では、UNIX を「UNIX と Linux」の略語と捉えている> (p. x)
1 章 bash の基礎¶
1.3 UNIX シェルの歴史¶
歴史的な説明から。
- Bourne シェル (sh)
作成者 Steven Bourne
1979 年に登場した最初の普及版 UNIX である Version 7 に搭載されていた
- C シェル (csh)
作者はカリフォルニア州立大学バークレー校の Bill Joy
Berkley Software Disribution UNIX (BSD UNIX) の一部として書かれた
- Korn シェル (ksh)
sh と csh の優れた機能プラス多数の独自機能から構成
商用製品
1.3.1 bash¶
bash の名前は Bourne Again Shell から来ている。sh へのリスペクトが込められている。
GNU プロジェクトのために作成されたシェルなので、無償で配布されている。
<bash は、GNU システム用の標準のシェルとして、公式には 1988 年 1 月 10 日の日曜日に産声をあげた> (p. 4)
1.3.2 bash の特徴¶
以下の三点を指摘している。
コマンドライン編集モード
ジョブ制御
主にシェルをカスタマイズしたりプログラミングしたりするための機能
1.4 bash の入手¶
echo $SHELL
で使用しているシェルを確認できる。手許の環境で試した結果、
/bin/bash
と出た。
1.6 ファイル¶
1.6.1 ディレクトリ¶
チルダ展開について。
ユーザー名の前に
~
を付けると、それはそのユーザーのホームディレクトリの絶対パスとなる。~
はユーザー自身のホームディレクトリを参照する。
1.6.2 ファイル名、ワイルドカード、パス名の展開¶
ワイルドカードとは記号だと思えばよい。すべてのファイルの名前がわからなくても、パターンで指定できる機能を利用するときに使う特殊な記号。
?
,*
,[set]
,[!set]
セット構造は初めて知った。
<開きかっこ (
[
) の後に感嘆符 (!
) を入れると、セットを「否定」することができる> (p. 12)
1.6.3 ブレース展開¶
後で以下の入力を試してみる。
echo b{ed,olt,ar}s echo b{ar{d,n,k},ed}s echo {d..h} ls *.{c,h,o}
1.7 入力と出力¶
1.7.1 標準入出力¶
標準入力を利用してのコマンド入力終了を告げるために Ctrl + D を押す。
1.7.3 パイプライン¶
<入出力リダイレクトとパイプラインが UNIX のブロック構造原理をどのように支援しているかが理解できたと思う。表記は実に簡単で強力である。特に重要なのは、パイプの概念によってコマンドの出力をほかのコマンドに渡すための見苦しい一時ファイルが要らなくなったことである> (p. 18)
1.8 バックグラウンドジョブ¶
バックグラウンドジョブの基本は
コマンド
&
jobs
でバックグラウンドジョブを確認することができる。
1.9 特殊記号とクォーティング¶
p. 21 表 1-6 に特殊記号がまとまっている。
1.9.1 クォーティング¶
特殊記号をリテラルで使用したいときは、それらを単一引用符で囲むことで OK だ。
1.9.2 バックスラッシュエスケープ¶
find . -name STRING などと入力する場合、
STRING
の部分にはワイルドカードを検索対象ファイル名として指示できるが、これを引用符で囲むこと。
1.9.5 コントロールキー¶
stty コマンドを使用すると、コントロールキーの設定を確認できる。また必要に応じて変更できる。stty all か stty -a と入力してみること。
うっかり Ctrl + S を押すと画面が止まる。もしだしぬけに画面が止まったら、Ctrl + Q を試すこと。<Ctrl + S キーと Ctrl + Q キーは基本的に迷惑な存在になっている> (p. 26)
2 章 コマンドライン編集¶
<bash の編集モードでは、UNIX エディタとして最も有名な vi と emacs と同様の編集コマンドを使って、コマンドラインを編集することができる> (p. 29)
<とにかく編集モードを 1 つは覚えておきたいという場合は、emacs モードをお勧めする。emacs モードのほうが、シェルそのものが提供する基本的な編集機能をより自然な形で拡張しているからだ> (pp. 29-30)
2.3 emacs モード¶
コマンドライン入力を <1 行のウィンドウからなる手軽な emacs> (p. 31) と考えればよい。
2.3.1 基本コマンド¶
emacs を知らないユーザーにとっては、<基本的なキー操作は覚えやすいが、emacs 特有の概念をひととおり身につけることが要求される> (p. 31)
2.3.4 履歴ファイル内での移動¶
emacs での行単位での上下方向の移動を、コマンド履歴の移動に流用している。
Ctrl + R は
reverse-i-search
になる。目当てのコマンドラインが見つかったら、Enter ではなく Ctrl + E を押すのがよさそう。
2.3.5 テキスト補完¶
<emacs モードの最も強力な(そして一般に使用されている)機能の 1 つは、テキスト補完 機能である> (p. 35)
最も重要なのは Tab である。
p. 37 の表 2-5 を見ると、いろいろな補完コマンドがあることがわかるが、やっぱり Tab 一丁で何とかなる。
2.3.6 その他のコマンド¶
Ctrl + L は
clear
と同じ。Ctrl + V は
quote-char
と同じ。Esc + . および Esc + _ が便利で、前のコマンドラインの最後のワードをポイント位置に挿入する。
2.6 履歴の展開¶
イベント指示記号
タイプミス直後に
^string1^string2
を活用できる。
ワード指示記号
<
!!:0
に続いて新しい引数を入力すれば、最後のコマンドを別の引数で実行することができる> (p. 51)
修飾子
このセクション、もう少し実用的な具体例が欲しい。と思っていたら、最後にこんなことが書いてあった。<履歴の展開は、コマンドをすばやく再実行するのに便利だが、前述のコマンドライン編集メカニズムでは無効になってしまう> (p. 52)
2.7 readline
¶
bash のコマンドライン編集インターフェイス。
テキストベースのインターフェースを有するアプリケーションが
readline
を利用している場合がある。キーバインドをカスタマイズすることができる。
2.7.1 readline
の起動ファイル¶
<デフォルトの起動ファイルは
.inputrc
である> (p. 52)<
readline
を使用するアプリケーションが別にある場合は、bash 専用のキーバインドを別にしておいたほうがよいだろう。これには、(略).inputrc
ファイルに$if bash
という条件文を挿入する> (p. 54)<変数を設定するには、
.inputrc
ファイルでset
コマンドを使用する> (p. 55)# bash を vi モードで起動するようにする set editing-mode vi
2.7.2 bind を使ったキーバインド¶
<bind -P と入力すれば、現在のキーバインドを表示することができる> (p. 55) そうなので、今手許の Cygwin で試したら大量に出力された。
<キー配列にシェルコマンドをバインドしたい場合には、bind -x が便利である>
# :kbd:`Ctrl` +L を ls コマンドにバインドする bind -x '"\C-l":ls'
2.8 キー入力の習慣¶
vi や emacs のエディタを使った経験がなければ、 emacs モードのキー入力を憶えることを著者は推奨している。また、 emacs のコマンド構造がミニバージョンを作成するのに向いていることも指摘している。
3 章 環境のカスタマイズ¶
冒頭で、環境という概念を、職場の机の例を挙げてわかりやすく説明している。文房具や電話機を個人の趣向に合わせて配置することは、環境のカスタマイズの一例だ。
3.1 .bash_profile
, .bash_logout
, .bashrc
¶
.bash_profile
はシステムにログインする度に読み込まれ、そこに書いてあるものを実行する。.bash_profile
に類似するファイルとして、.bash_login
と.profile
がある。.bash_login
は C シェルの.login
に由来している。.profile
は Bourne シェルと Korn シェルの同名の設定ファイルに由来している。ログイン時には、これらのいずれか一つだけが読み込まれる。優先度は
.bash_profile
,.bash_login
,.profile
の順。
コマンドラインから bash を起動した場合(サブシェル)、
.bashrc
からコマンドを読み込もうとする。
3.2 エイリアス¶
構文は以下の通り。等号記号の前後に空白文字を入れてはならない。
alias <名前>=<コマンド>
bash はエイリアスの対象となるものにテキスト置換を実行する。例えば alias printall='pr * | lpr' というエイリアスに対して、
*
をワイルドカード展開する。エイリアスは再帰的であるが、無限ループに陥らないようにできている。
# 無限ループにならない alias ls='ls -l'
等号なしで alias XXXX を実行すると
XXXX
の値が表示される。引数なしで alias を実行すると、定義済みのエイリアスの一覧が表示される。
エイリアルは、<シェルのスクリプトや関数では基本的に無効となる> (p. 64)
3.3 オプション¶
set -o <オプション名> と set +o <オプション名> が基本。前者はオプションを ON にし、後者は OFF にする。
ignoreeof と nounset が面白そう。
オプションの状態を確認するには、単に set -o とだけ入力する。
今試してみたら、ほとんどのオプションが値が
off
だった。
3.3.1 shopt¶
bash 2.0 で追加されたコマンドで、環境変数や set コマンドで行われていた設定に代わるもの。
shopt -p で一覧を見てみよう。
3.4 シェル変数¶
変数を定義する構文は
<変数名>=<値>
であり、等号記号の左右に空白文字は入らない。変数を削除するには unset <変数名> とする。別に便利ではないようだ。
<変数の値を確認する最も簡単な方法は echo コマンドを使用することだ> (p. 67)
3.4.1 変数とクォーティング¶
<引用符で囲まれている文字列を 1 つのワードをシェルに思い込ませる> (p. 68)
3.4.2 組み込み変数¶
最初にコマンドライン履歴関連の変数を紹介している。よく使っているのは
HISTFILESIZE
,HISTSIZE
,HISTTIMEFORMAT
の三つ。HISTCONTROL
変数をうまく設定すると、重複するコマンドラインが履歴リストに追加されなくなる。例えばHISTCONTROL=ignoredups
とする。
プロンプト変数 (
PS1
,PS2
,PS3
,PS4
) により、プロンプトをカスタマイズできる。<Bash は 4 種類のプロンプト文を使い分ける> (p. 73)
<プロンプト文を設定する最も効果的な方法は、常にカレントディレクトリが表示されるようにすることだろう> (p. 74) たとえば
PS1="\u \!--> "
のようにする。<セカンダリプロンプト文は、コマンドラインを入力して RETURN キーを押したときに、コマンドが未完成であることを示すために使用される> (p. 75)
コマンド検索パス
PATH
この記法をおさえる。
PATH=$PATH:"/home/user-name/bin"
セキュリティ上
PATH
を自分のディレクトリをほかのよりも優先されるように設定してはいけない。
bash はコマンドハッシュなるものを管理している。hash コマンドでそれを確認できる。
<hash の詳細について頭を悩ませる必要はない> (p. 77)
CDPATH
の紹介。「Cygwin へ送る」ユーザーである私は使わない。
3.5 カスタマイズとサブプロセス¶
<ユーザーがコマンドを入力するたびに、シェルがそのコマンドをサブプロセスで実行することを思い出そう。複雑なプログラムになると、サブプロセスを独自に生成することもある> (p. 79)
3.5.1 環境変数¶
環境変数は、すべてのサブプロセスが参照できる特殊なシェル変数だ。
以下のように処理した変数は、環境変数として使用することができる。
export <変数名> # or export <変数名>=<値>
特定のサブプロセス環境だけで使用する環境変数を定義することもできる。
TERM=trythisone emacs file-name
環境変数をリストするには export を引数なしで実行する。
実行してみたら declare -x の嵐となった。
3.5.2 環境定義ファイル¶
<原則としては、
.bash_profile
内の定義をできるだけ減らし、環境定義ファイル (.bashrc) の定義をできるだけ増やす> (p. 84)stty stop ^S intr ^C erase ^? date source .bashrc