Showing posts with label Shell. Show all posts
Showing posts with label Shell. Show all posts

July 2, 2008

ちょっとした失敗

なんか--hogeみたいなファイルができててコマンドを*で実行したら--hogeなんてオプション知らねえとか言われて、何を言ってるのか最初さっぱり分からんかった。状況的にはこんな感じ。

% touch -r -f
% mkdir foo
% rm *
% ls
-f -r
ワイルドカードの前に--を入れとくのが安全だよね。

April 21, 2008

日本語フォルダ

日本語名のフォルダってterminalから使うとうざったいよね、という話から出てきた一行

alias gcd='eval "cd $(zenity --file-selection --directory)"'

March 26, 2008

wildcardとsort order

shellでecho *みたいなことをした結果があるマシンではfoo 00-barで、あるマシンでは00-bar fooと結果が異なる問題の原因を追求していた。結論から言うと、出力結果のソートにstrcoll(3)あるいはそれに類する関数を使っていて、こいつがcurrent localeによって結果が違う、ということだった。

ざっとkernelからglibc、bash(ついでにsortも)と追いかけて、途中薄々気づきはしたものの、結果にたどり着くまでえらく時間を使ってしまった。コードの追いかけに付き合ってくれたjetに感謝。

April 27, 2007

Process Substitution

zshやbashにはProcess Substitutionという機能が備わっていて、これを使うことで一時ファイルを経由せずにプロセス間でやりとりできる。

例えば、あるログからgrepで必要な部分だけを取りだし、またもう一方のログからもgrepで必要な部分だけを取り出して、双方のdiffを取る、という処理をする場合に、これまで一時ファイルを作成してdiffを取っていた。ところが

$ diff -u <(grep foo foo.log) <(grep foo bar.log)

これだけでいいらしい。たいへん衝撃的な出来事だった。
裏では何が行われているかというと、それぞれの出力先fdを/proc/self/fd/nとしてdiffに渡している。

ちなみに、>(process)で出力として使える。

$ grep blog.tagoh.jp /var/log/apache2/access.log | tee >(grep -E '(google|yahoo)' > foo) | grep -v -E '(google|yahoo)' > bar

まあこんなことは普段しないし、しようとも思わないんだけど、出力を何種類かにわけて異なる処理をしたい場合に便利かもしれない。