カテゴリー「Linux」の19件の記事

2013年12月 5日 (木)

bashの正規表現その2(不完全版)

久しぶりのエントリです。bashスクリプトの正規表現・・・とかいうタイトルで5年前に書いたのですが、これは、bash自身というよりも、exprコマンドで正規表現が扱えますよ・・・という内容でした。まぁそれはそれで良いと思うのですが、実はbash自身に正規表現の機能があるってことを最近知ったので、書いてみます。

お題

データを行毎に記録したテキストファイル(例:data.txt)がある。そのテキストファイルを1行ずつ読み取って、コマンドを実行したい。ただし、#で始まる行や空行は無視したい。

入力

$ cat data.txt 
one 
#two
thr#ee
four 
  
five 
six# 
se #ven
 
 nine 
ten 
$

解答と実行結果

[[ 対象文字列 =~ 正規表現 ]]
でマッチ/アンマッチの判定ができる。ポイントは、正規表現をダブルクォートで囲まない事。みたい。
$ cat regexp.sh 
#!/bin/sh 
TARGET_FILE="data.txt" 
while read LINE 
do 
    if [[ $LINE =~ (^#|^ *$) ]]
    then 
        continue 
    else 
        echo "$LINE" 
    fi 
done < $TARGET_FILE
 
$ ./regexp.sh
one
thr#ee
four
five
six#
se #ven
nine
ten
$ 

後方参照

さらには、括弧でくくった場所を
${BASH_REMATCH[x]}
で後方参照できる。
${BASH_REMATCH[0]} #-> マッチ全体
${BASH_REMATCH[1]} #-> 1番目の括弧
${BASH_REMATCH[2]} #-> 2番目の括弧
:

お題2

#記号を含む行を出力したい。加えて、該当行のうち#記号から行末までの文字列を抜き出したい。

解答と実行結果

$ cat ./regexp2.sh
#!/bin/bash
TARGET_FILE="data.txt"
while read LINE
do
    if [[ $LINE =~ ^[^#]*(#.*)$ ]]
    then
        echo -n "${BASH_REMATCH[0]},"
        echo    "${BASH_REMATCH[1]}"
    else
        :
    fi
done < $TARGET_FILE
 
$ ./regexp2.sh
#two,#two
thr#ee,#ee
six#,#
se #ven,#ven
$

メタキャラクタ

良く分からないのは、このbashの正規表現で使えるメタキャラクタです。数値の意味で\dが使えないのです。(文字'd'にマッチしちゃうみたい)どこかにbashで使える正規表現のメタキャラクタの一覧がないかなぁ。

| | コメント (0) | トラックバック (0)

2010年12月 9日 (木)

Android開発

意外な事に、仕事でAndroidアプリの開発をやりそうな気配あり。早速Amazonで参考書を物色した。参考書がいくつか出ているなぁとは思っていたけど、本気で探した事が無かったので、改めて探してみると、決め手に欠けてどれを買うべきか悩む。定番本がまだ確立していればありがたいのだけど。それにしてもどれもにたようなタイトルで紛らわしい。Amazonの評価を頼りにすると、この辺が良さそうな感じだった。

  1. 評価はそこそこだが、2009年6月の出版がやや古いか。中身を見てみないと判断が難しい

  2. 評価は高く、分厚いとあって情報量も豊富そう。Androidの基本的な考え方が書いてあるというレビューがあるので、そこもポイント。2009年7月とやや古いのが弱点かも知れないがそこは別の本でカバーすべきかも。これは欲しい。

  3. Amazonの評価はそこそこで、タイトルに2.1を謳っているだけあって2010年5月と比較的新しい本。レビューを良く読むと物足りないところもあるようだが、とりあえずアプリの開発が一通りはできるようになるかなと。結局近所の書店で唯一見つけた本書を購入した。
Android2.1プログラミングバイブル(仰々しい名前)を読みながら、開発環境の構築まで今のところスムーズに進んでいるので、次、まずはサンプルアプリケーションの完成まで行きたいところ。

| | コメント (0) | トラックバック (0)

2010年8月20日 (金)

Macでbash-4をビルド

リポジトリを作る

githubに、なにか面白いプロジェクトないかなぁ、bashとかないかなぁと思っていたら、ありました。これです。始める前は、githubでリポジトリをフォークしてそのURLに対して

 $ git checkout http://... # 誤用

ってやってローカルのMacBookに作業コピーを作れば良いのかと思ってたのですが、入門gitを読むと全然違ってました。分散バージョン管理ってのを根本的に勘違いしてました。gitってリポジトリのコピーとマージが簡単にできるsvnかと思ってたんですが、そうではなく、「ローカルにリポジトリを持ってきてそこで作業をする」んですね。という訳で、最初のコマンドは

 $ git clone git@github.com:endu/bash-4.git

が正解なのでした。

bash-4をビルドする

とりあえず、ローカルにリポジトリができたので、早速ビルドです。

 $ cd bash-4
$ ./configure
$ make
(略)
gcc -L./builtins -L./lib/readline -L./lib/readline -L./lib/glob -L./lib/tilde  -L./lib/sh    -g -O2 -o bash shell.o eval.o y.tab.o general.o make_cmd.o print_cmd.o  dispose_cmd.o execute_cmd.o variables.o copy_cmd.o error.o expr.o flags.o jobs.o subst.o hashcmd.o hashlib.o mailcheck.o trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o alias.o array.o arrayfunc.o assoc.o braces.o bracecomp.o bashhist.o bashline.o  list.o stringlib.o locale.o findcmd.o redir.o pcomplete.o pcomplib.o syntax.o xmalloc.o  -lbuiltins -lsh -lreadline -lhistory -ltermcap -lglob -ltilde  lib/intl/libintl.a -liconv  -ldl Undefined symbols:
(略)
   "_rl_completion_suppress_append", referenced from:
       _bash_default_completion in bashline.o
       _command_subst_completion_function in bashline.o
       _pcomp_set_readline_variables in pcomplete.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [bash] Error 1
$

がーん。なんで!?どうやら最後のリンクで失敗しているみたいです。

リンクエラーの原因を究明する

リンクエラーの理由を求めてWebをさまようと、やはり困っている人がいて、どうやら、最新のreadlineライブラリ入れる必要があるみたい。readlineのライブラリってどれかなぁ。これかな?なんかへんなの。

 $ ls -l /usr/lib/libreadline.dylib
lrwxr-xr-x  1 root  wheel  15  9 24 2009 /usr/lib/libreadline.dylib@ -> libedit.2.dylib

うーん、じゃあ具体的にはどうしたらイイのさ、と思っていたら、 決定的な記事を見つけました。以下激しく引用。

Mac OS X では GNU の Readline ライブラリがインストールには含まれておらず、Readline 互換の Libedit というライブラリへのシンボリックリンクとなっている(こうなっている理由はライセンス上の問題からだと思われる。GNU の Readline ライブラリは GPL で、Libedit は BSD ライセンスだ)。

しかし、これが原因で Readline 対応のプログラムがコンパイルできない、コンパイルできてもヒストリ機能などが使えない、といった問題がしばしば起こる。

なるほど!で、readlineをインストールするには、MacPortsとやらを使うのが簡単みたいです。MacPortsって名前だけ知ってて何かと思ったら、yumとかapt-getとかそういうやつみたいですね。もし間違ってたら指摘して頂けるととうれしいです。

MacPortsでlibreadline.aをインストールする

まずはMacPortsから。安直に本家からsnow leopard版の.dmgファイルをDL→mount→.pkg起動。あとはインストーラのボタンを順次押すだけでインストール完了。svnでソースをcheckoutするとか、ソースのtarをDLしてmakeもできるみたいだけど、makeで苦労しているのにさらにmakeするのはしんどいので楽なやり方で。.bash_profileに環境変数の設定が追加されているのを確認して、反映。portコマンドが見える!

 $ cd ~
$ cat .bash_profile
(略)
# MacPorts Installer addition on 2010-08-20_at_12:03:34: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.
$ . .bash_profile
$  which port
/opt/local/bin/port

ので、早速libreadline.aを入れてみます

 $ sudo port install readline
Password:
--->  Computing dependencies for readline
--->  Dependencies to be installed: ncurses ncursesw
--->  Fetching ncursesw
--->  Attempting to fetch ncurses-5.7.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/ncurses
(略)
--->  Fetching readline
--->  Attempting to fetch readline-6.1.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/readline
(略)
--->  Cleaning readline
$

ncurses,ncureswってのも必要なんですね。portが自動で入れてくれました。

再度bash-4をビルド

configureを走らせる時に、CPPFLAGSとLDFLAGSを、MacPortsで入れたライブラリのパスに設定するのを忘れずに・・・(といいつつ良く分っておりません。最初失敗して、その後Makefileを手で修正しようとして、結局先ほどの記事を参考にさせていただきました。configureの仕組を良く理解せねば。)

 $ make clean
(略)
$ CPPFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib ./configure
(略)
$ make
(略)
ls -l bash
-rwxr-xr-x  1 hide  staff  944128  8 20 13:14 bash
size bash
__TEXT __DATA __OBJC others dec hex
638976 32768 0 4295249920 4295921664 1000e9000
$

できたぁ!

 $ ./bash --version
GNU bash, version 4.0.35(1)-release (i386-apple-darwin10.4.0)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. $

| | コメント (0) | トラックバック (0)

2009年10月12日 (月)

Windowsのコマンドプロンプトをckwとnyacusで使いやすくする

Windowsで一番腹立たしいのは、cmd.exeの使いづらさです。pwdとかlsとか使えないし、ctrl-aとかctrl-eとかも使えないし、ヒストリも使いづらい!
で、単純に考えると、cygwin使えばいいじゃんってなるんだけど、cygwinってなんていうか、UNIXをエミュレートしてるんで、いや、そこまでUNIXじゃなくても。それならLinuxつかいますよ的なところがあります。
そんなわけで、Windows上でLinuxライクな環境ができないかなーと思っていたら見つかったので、ここにメモしておきます。

■何を入れるの?
・ckw
Windows上でのシェルのGUIラッパー。シェルの「表面的な操作性」を向上させる。標準ではcmd.exeをラップして、マウスのコピペが楽になったり、背景を透過させたり、日本語入力を半角/全角キーでできたりするようになるみたい。
で、こいつのミソは「シェルを選べる」こと。
すでにオリジナルの公開は終わっているみたいですが、幸いGPLだったおかげで修正版を公開されている方がいらっしゃいます。
http://d.hatena.ne.jp/hideden/20071123/1195822428
それに加えてさらにラップ対象のシェルの画面が残ってしまうバグの対処版も公開されていて、
http://blogs.wankuma.com/shuujin/archive/2008/10/15/158825.aspx
とりあえずこれをありがたくDL

・nyacus(にゃーかす)
  で、選ばれるシェルが、これ。tcshライクな操作性を持つ、cmd.exe上で動作するシェル。今回のキモ。
  ポイントは、Windowsネイティブアプリであることと、Unixの基本的なコマンドも内部的に持っていること。
  bashじゃないのが残念ですが、これでWindows上のコマンドプロンプトでLinuxのような操作感が得られます。
  http://www.nyaos.org/index.cgi?p=TEST+VERSION
  TEST VERSIONとはなっていますが、最新版で良いかと。

・vim
  ちょっとわき道にそれるますが、僕の一番好きなエディタ。xyzzyも良いんだけど、vimの軽快さ、自由自在さに慣れると、やっぱりvimが気持ちよい。xyzzyも慣れたいんだけどなー。
  ctrl-p,nで単語補完とか、*一発で単語検索とか、ビジュアルモードで行を選択して=一発で再インデントとか、qx...q -> @xでマクロとか。 xyzzyでもある程度はいけると思うんだけど。。。こちらは定番香り屋さんからありがたくDL
  http://www.kaoriya.net/#VIM72

■どうやって入れるの?
で、インストールですが、DLしたファイルを展開した後、ckwとnyacusは同一フォルダに配置。私は

[C:デスクトップ]$ ls -1 \freesoft\ckw
NYACUS.EXE
_nya
ckw.cfg
ckw.exe

こんな風に置いてます。で、ckw.cfgでシェルにnyacusを指定

Ckw*exec: c:\freesoft\ckw\NYACUS.EXE

その他ckw.cfgの詳細は、
http://blog.blueblack.net/item_358
を参考にさせていただきました。

それから上記フォルダをworkディレクトリとして起動するようにckwへのショートカットをデスクトップに作成。
#これはお好みで。PATHを通したりするのが上品なのかも。

vimはお好みですが、

freesoft\vim

配下に配置しました。

で、_nyaの設定ですが、プロンプトが改行が入っていまいちなので、一行になるように修正("$_"を消しただけ)。

# option prompt $e[31;40;1m[$w]$_$$ $e[37;1m
option prompt $e[31;40;1m[$w]$$ $e[37;1m

あと、vimへのaliasを作成

alias vi c:\freesoft\vim\vim.exe
alias vim c:\freesoft\vim\vim.exe

その他の設定はここを参考にさせていただきました。
http://umeji.blogspot.com/2008/05/nyacusckw.html

その他、nyacusに付属していないツールについて
http://qwerty777.s57.xrea.com/winunix/command.htm
を参考にインストールすると良いかと。

| | コメント (0) | トラックバック (0)

2009年2月14日 (土)

2009/2/14は・・・

記念すべき日

2009年  2月 14日 土曜日 08:31:30 JST
time_t = 1234567890
Happy Valentine's Day!
[lucy@fedora7 ~]$

アホプログラムを書いてしまいました・・・

[lucy@fedora7 ~]$ cat ./happyValentine.sh
#!/bin/sh
while :
do
    date
    TIME_T=`date +%s`
    echo "time_t = $TIME_T"
    usleep 500000
    if [ $TIME_T = 1234567890 ]
    then
        echo "Happy Valentine's Day!"
        exit 0
    fi
    clear
done

| | コメント (1) | トラックバック (0)

2008年7月16日 (水)

入門UNIXシェルプログラミング

前から書いていることですが、いまやamazonのカスタマーレビューやら書評ブログ(というまでもなくGoogle)のおかげで、良書とよばれるものをとっても簡単に選び出すことができるようになりました。特にC言語やWordの参考書などは山ほど出版されていて、本屋で見ただけではどれが良いのか(それともそこで売っている本は全てダメなのか)判断できません。

ちょっと前までは、そんな風に判断する材料もなく、「雰囲気で」買わざるを得ませんでした。しかし今は違います。Wordについてよい参考書を知りたければamazonで検索します。Rubyについてよい本が欲しければamazonで検索します。。。

なのですが、たまに本屋で、「これは買わねばならぬ!」と衝動的に買ってしまうこともあります。それが本書でした。今年のテーマは「定番を読む」なので、それに合致していると思ったためでもあります。

本書はBourne Shell (/bin/sh)についての入門書/解説書です。邦題は入門と銘打っていますが原題は"Portable Shell Programing: an extensive collection of bourne shell examples"であり、内容は移植性に配慮する点も含め、非常に実戦的です(いまやlinuxでbashな環境がメジャーだと思うので、そこまで高い移植性が求められることは少ない気もしますが)。辞書的に使うつもりなので、まだ全部読んでいませんが、タイミングがないのでentryを書いておきます。

この前悩んでいた「ファイルを一行ずつ読んで処理する」も巻末のFAQにあっさり載っていました。shの関数が、まるで同名のコマンドがあるかのように扱えるという指摘になるほどと思わされました(本書を読むまで気づかなかった!)

いつも場当たり的にググりつつbashとshの境界もあいまいのままスクリプトを書いている僕みたいな人にとっては、shのルールとサンプルとFAQが一通り載っている本書は常備する価値があると思います。

| | コメント (0) | トラックバック (0)

2008年4月18日 (金)

edとヒアドキュメント

いまどきedなんて使う人いるのかと思っていたら、最近edってありがたいなーと思う機会がありました。ヒアドキュメントと正規表現を使えば素敵なスクリプトがかけますね。

たとえば、狂信的zsh信者なら
#!/bin/sh
PASSWD_FILE="/etc/passwd"
ed $PASSWD_FILE << EOF
%s/\/bin\/bash/\/bin\/zsh/g
w
q
EOF

これでみんなのシェルを強制的にzshに変えられます。crontabに仕掛ければ直しても直してもzshです。ヒドイですね。現実的にはたくさんのサーバでファイルを同じ様にに編集しなきゃいけないときとかに使えます。

あーよく考えたら、edの代わりにvimでもおんなじ様にできるのでしょうね(未検証)。でもedの方が軽くてスクリプトになじみますね。

ではまた。

| | コメント (0) | トラックバック (0)

2008年4月 8日 (火)

LINUXデスクトップHACKS

結論から言うと、訳が酷くて全部読んでません。翻訳は株式会社ドキュメントシステムというところですが、バイトの大学生が訳したのでしょうか?bashのターミナルのカスタマイズの項に惹かれて深く考えずに買ってしまったのですが、正直ちょっと後悔してます。

内容としては、デスクトップHACKSというタイトルにも関わらず、単純な「デスクトップの見た目」の話だけではなくて、ブートにまつわる話題やカーネルの話、ハードウェアの話も載っていて、個人的にはそっちの方が興味深いです。が、いかんせん訳が酷い。「究極的な端末の透明性」とか。。。これなら原文のままで、ページの下に難しい単語の意味を載せた中学校の教科書スタイルの方が分りやすいと思います。

あまり悪口は言いたくないのですが、内容に期待していただけに、残念だったので。オライリーは、もうちょっとユーザーフレンドリーになってもいいなぁと思います。

| | コメント (0) | トラックバック (0)

2008年4月 5日 (土)

bashの改造

bashを改造して、入力コマンドのログを記録するようにしてみる。入力したコマンドを知るためにはlastcommとかあるけど、イマイチな感じなので。。。と思って、とりあえず、ここからbashのソースをダウンロードする。その後、

$ tar zxf bash-3.2.tar.gz
$ cd bash-3.2
$ ./configure
$ make

でとりあえずmakeしてみた。どこにmainがあるんだろうと思ってgrepしてみたら、何箇所かmainが出てきて戸惑う。で、改めてソースファイルを見てみると、eval.cとかshell.cとかexecute_cmd.cあたりが怪しい感じ。色々見てみると、COMMANDっていう構造体(を起点に構成される各種構造体のリスト)に入力コマンドが単語に分かれて格納されているみたい。コメント文にbisonがどーのと書いてあるソースがあったので、おそらく、bashの入力文字列をまず構文解析して、その結果をいったんCOMMAND構造体群に格納しているのではないかなと。

で、僕が欲しいのは入力文字列なのだけど、これまたprint_cmd.cっていうそのままのソースがあったので、そこに仕掛けをして再makeして実行してみたけど、残念ながら入力コマンドがログに出力されない。ちょっとハズしたみたい。ただ、make_command_string()っていう、COMMAND構造体から文字列を生成する関数は使えそう。

で、結論を言うと、execute_command()っていう関数内で、command変数をmake_command_string()に渡して文字列化して、それを出力するととりあえず満足する結果が得られました。興味のある方は、execute_command()関数内で、入力コマンドをログ出力するなり、syslogに渡すなり、標準出力に出すなり、色々やってみてください。

なお、このページではdoxygenで作ったと思しきオープンソースのドキュメントが公開されています。バージョンが古いですが、bash-2.05bも載ってます。

| | コメント (0) | トラックバック (0)

2008年3月15日 (土)

Inside Linux Software

先日makeについてエントリを書いのですが、書きたかったこと(以上のこと)が本書に載っていました。タイトルからはなんとなく、カーネルだとか、ディストリビューションの構成について書かれた本のように想像してしまいますが、そうではなく、筆者がはじめにに書いている通り、オープンソースの世界に貢献するための、技術的な一般教養について語った本です。ただ、gccがコンパイルとリンクでどのようなことをするのか、makeはどのように実行されるのか、パッチの作り方や当て方はどうするのか、などについて背景や仕組みから詳細に述べられており、オープンソースに限らず、Linux上で開発を行っているプログラマ全般にとって、ステップアップのために有用だと思いました。特にgccがコンパイルとリンクで何を行うのかについては恐ろしく詳しく書いており、大変ためになりました(プリプロセス後のソースの出力の仕方、コンパイル後のアセンブリコードの出力の仕方、静的/動的ライブラリの作り方、両者のメリット/デメリット、動的ライブラリの検索パスの決まり方、などなど)。gccって、いろんなツールを呼び出してコンパイルやリンクをしてたんですね。知りませんでした。

さて、本書は以下の6章からなっています。

  1. プログラムのコンパイルとリンク
  2. ビルドの自動化とautotools
  3. ソフトウェアの国際化
  4. パッチの作成と適用
  5. ドキュメントの記述
  6. RPMによるソフトウェア管理

続きを読む "Inside Linux Software"

| | コメント (0) | トラックバック (0)

より以前の記事一覧