本を読む

読書やコンピュータなどに関するメモ

「bashクックブック」

bashクックブック
bashクックブック
posted with amazlet at 08.10.07
Carl Albing JP Vossen Cameron Newham
オライリージャパン
売り上げランキング: 2283

 bashに関する逆引き形式の入門書。つまり、体系的というよりは、小技やTipsを軸に、どちらかというと即物的に解説していくスタイル。より体系的で踏み込んだ内容については、本書の「はじめに」でも書かれているように、「入門bash」あたりを併読することになると思う。

 シェルスクリプトとコマンドライン(readlineや補完設定を含む)のほか、ssh-agentやscreen、subversionなどのごく簡単な入門まで扱っているのが、いかにもbashらしい。共有ライブラリによる内蔵コマンドの追加も、ちょっとだけ扱っている。

 私はman bashや「入門bash」を拾い読み(通読ではなく)したぐらいの知識しかないので、いくつか参考になった。そのうち「入門bash」も通読しなくちゃ。

 以下、自分の勉強メモとして、知らなかった機能と、内容の補足。

知らなかった機能

レシピ2.14 複数のコマンドからの出力の保存またはグループ化

{ pwd; ls; } > /tmp/all.out

 いままで同じことをサブシェルでやっていた。知らなかった。

レシピ5.7 シェルスクリプトでのパラメータの使用

 $10は${10}ではなく${1}0と解釈される。やってみたら本当だ。

レシピ6.8 正規表現による評価

 bash 3.0以降では「[[ 文字列 =~ 正規表現 ]]」が使える。おお、正規表現が使えるのか、すばらしい。

$  [[ 'abcdefg' =~ a.*(c.).*g ]] && echo ${BASH_REMATCH[1]}
cd

 手元のman bashでは、日本語版には書いてなかったけど英語版には書いてあった。

レシピ10.5 関数の使用:パラメータと戻り値

 シェルの配列変数FUNCNAMEに、シェル関数の呼び出しバックトレースが入っている。$FUNCNAME(${FUNCNAME0]と同じ)でその関数自身の名前がとれる。

レシピ12.3 MP3プレイヤーのロード

 関数定義の本文は「{ }」(グループ化)でなくてもいい。へー。

function REDUCE()
(( FREE-=${1:-0} ))

レシピ14.3 安全な$PATHの設定

 getconfコマンドで変数の標準の値を調べる。

$ getconf PATH
/bin:/usr/bin

レシピ15.5 可搬性のあるforループの使用

 bash 3.0以降では、{n,m}構文が使える。「Re: コマンドラインで連番のファイル名を作る」でzshの例として指摘をいただいた方法の低機能版ですな。

$ echo a{1..5}  # 1桁の数字
a1 a2 a3 a4 a5
$ echo 1{a..e}  # 1桁の文字
1a 1b 1c 1d 1e

レシピ15.13 「引数リストが長すぎる」エラーへの対処

 コマンドの引数(を展開した結果)の個数はARG_MAXの制限を受けるが、forに指定するリストは受けない。へー。

レシピ16.12 シェル履歴オプションの設定

 bash 3.xでは、シェル変数HISTIMEFORMATを設定することで、履歴に日時を追加できる。

レシピ17.2 LinuxでのGNU TexinfoおよびInfoの使用

 「(Linux上のGNUツールでは)従来のmanpageはスタブにすぎない」。

レシピ17.10 diffとpatchの使用

 単語単位のdiffをとるwdiffコマンド。

レシピ17.16 一方のファイルにのみ存在する行の検出

 行ごとにファイル1、ファイル2、共通行をカラム表示するcommコマンド。

レシピ17.24数字の桁区切り

 printfの「'」フラグ。

$ printf "%'d\n" 12345
12,345

レシピ19.13 スクリプトのデバッグ

 bashのデバッガが作られているらしい。「The Bash Debugger Project」。DebianやUbuntuにあるbashdbパッケージってこれかな。

付録B bashに含まれているサンプル

 「./loadables/perl/ Perlインタープリタをbashに組み込む方法」。へー。

内容の補足

レシピ1.3 コマンドの検索と実行

 「解説」がtypeコマンドから説明しているのに、「解決」にはtypeが載ってない。

レシピ1.10 Linux用のbashの入手

 Debianでbashパッケージとbash3パッケージに分かれているとあるが、2008年10月現在のstableであるetch以降ではbashパッケージにbash 3.xが収録されている。原著の出版時期としてしかたがないけど。

レシピ2.11 ファイルの先頭または末尾だけの使用

 間違いではないけど、「head -<行数>」は最近ではGNUやBSDのmanからも削られている古い形式だと思う。

レシピ5.18 文字列の部分的な変更

 悪い例としてこう書かれているけど、

mv "${FN}" "${FN/.bad/.bash}"

例として上げられているような結果には、下のように書かないとならないと思う。

mv "${FN}" "${FN/bad/bash}"

レシピ6.1 シェルスクリプトでの算術演算の実行

 「$((式))」と「let 式」が紹介されてるなら、「((式))」が同じく並んでいてもいいと思った。man bashでも「This is exactly equivalent to let "expression"」とあることだし。

レシピ6.4 複数の属性の評価

 testで-oの前の式が真になったときだけ後の式のパラメータ置換を処理するには、「if文を2つのネストされたif文に分解すればよい」とあるけど、「[ 式1 ] && [ 式2 ]」でいいと思った。

レシピ7.3 検索結果からの真偽値の取得

grep findme bigdata.file > /dev/null
if [ $? -eq 0 ] ; then echo yes ; else echo nope ; fi

は、わざわざ$?を持ち出さなくてもいいんじゃないかと。

if grep findme hoge.sh > /dev/null ; then echo yes ; else echo nope ; fi

レシピ9.2 特殊文字が含まれたファイル名の処理

 findの結果をxargs -i '{}'に渡すことについて「findコマンドの-execを使用する利点は、特殊な文字に対処することだけである」とあるが、どちらでも同じ結果になるようだ。

レシピ10.2 inlcudeとsouceによるコードの再利用

$include $HOME/myprefs.cfg

が.inputrcではなくシェルスクリプト中で使えるのは、単にシェル変数「include」の値が空になっていて「$HOME/myprefs.cfg」がコマンドとして実行されているだけなのではなかろうか。

レシピ10.2 inlcudeとsouceによるコードの再利用

 「レシピ10.3で示すように」→「レシピ10.4で示すように」、かな。

レシピ13.1 シェルスクリプトの引数の解析

shift $(($OPTIND - 1))

 細かいけど、レシピ6.19でせっかく「$((...))式の内部で変数名に$を使用する必要はない」と解説しているので、OPTINDに「$」はなくていいんじゃないかろうかと。あってもいいけど。

レシピ13.9 1文字ずつの取得

 readで1行読んで文字列操作で1文字ずつ取り出しているけど、read -n 1でいいのではなかろうか。キーボードからの入力を除いて。

レシピ13.14 ホワイトスペースの削除

 ホワイトスペースが削除された出力の例にすべてホワイトスペースが残っている。

レシピ17.7 ログアウト時の画面の消去

 参照URLで「Faraday_cag」→「Faraday_cage」。

レシピ17.17 最後のN個のオブジェクトの維持

 「$files_to_nuke=$(shift_by 5 $(ls ?))」は「files_to_nuke=$(shift_by 5 $(ls ?))」だと思う。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/460-c27b8015

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad