技術メモ帳 このページをアンテナに追加 RSSフィード

2007-02-18

[]漢のzshに乗り換えた時にアッーってなるコト 00:40 漢のzshに乗り換えた時にアッーってなるコトを含むブックマーク 漢のzshに乗り換えた時にアッーってなるコトのブックマークコメント

男のbashユーザーが、バラ色の紳士こと漢のzshに乗り換えたときに

アッーってなるコト事を先ほどいくつか思いついたので共有する。


!!とかの履歴実行はrコマンドで

zshには、r というシェル組み込みコマンドがあって

履歴からの実行が簡単に行える。

たとえば、一番最後に実行したviコマンドを実行したいときなどだ。


bashなんかだと !vi で出来るのだが、

rコマンドだったら

% r vi

でよい。


直前に実行したコマンドを再び実行したいとき、

bashなんかだと !! というやり方になるが、

rコマンドでは、

% r

とするだけでよい。


また、文字列を置き換えてからの履歴実行はどうだろう。

たとえば次のようなbashの例だ。

$ vi .zshrc
$ !vi:s/zsh/bash/

これは、最後に実行したviコマンドの引数文字列を

":s/zsh/bash/" によりzshという文字列をbashという文字列で

置き換えしたあとで実行するというものだ。


rコマンドだとこうなる。

% r zsh=bash vi

入力が若干楽(かも)。


さらにくだらないことを言うとbashだったら

$ ^zsh^bash

de okだったりする。


複数のリダイレクトを記述できる

zshでは、setopt multios しておくと、

リダイレクトを複数記述する事ができる。

% echo aiueo > ./test1.txt > ./test2.txt > ./test3.txt

% head test?.txt
==> test1.txt <==
aiueo

==> test2.txt <==
aiueo

==> test3.txt <==
aiueo

リダイレクトしつつパイプに流すなんて事も可能だ。

tee コマンドが不要になるってことさ。

% echo aaa > ./test.txt | cat
aaa

repeat文で簡単複数回実行

bashユーザーはコマンドを複数回実行させたいとき、

おそらくこうやるだろう。

$ for n in 1 2 3; do echo aaa done;
$ for n in `seq 1 3`; do echo aaa done;

ネット右翼共はfor文を非常に嫌うものであり

xargsでの例も紹介しておこう。

コレを書かないとボクの身の周りにとても不幸なことが起こるのである。

$ yes ' ' | head -n3 | xargs -n1 echo aaa

さて、バラ色の紳士、漢のzshユーザーはどうやるかというと

repeat文という最適な制御文を使う。

% repeat 3 echo aiueo


何度も言ってるが、複数回実行しつつ監視したいときはwatchコマンドが便利だ。

定期的にコマンドを実行しその出力の変化を監視する - 技術メモ帳


すごくおすすめだ。ただし、BSD系OSだとストーキング行為に

最適である同名コマンドが存在しているので注意が必要だ。

運悪く実行しているところを見られるとHENTAI扱いされてしまう。

HENTAIとは変態性欲者、そうつまりはあなたようなヒトのことなのである。


あと、ただ単に複数回実行したいだけなら

zshの場合は Meta+A(ESC-A, ALT+A) で

同じコマンドを何度も簡単に実行できる。これまたすごくおすすめ。


cdコマンドの機能強化

cdコマンドはエキセントリックに進化してる。


たとえば、/usr/local/mysql ディレクトリから

/usr/local/share に移動したいとき以下のようにする事で簡単に移動できる。

/usr/local/mysql$ cd mysql share
/usr/local/share$ 

ようは、置き換えが出来るという訳だ。


cd var1 var2

var1でマッチしたものをvar2で置き換え後、移動する。


sort | uniq はつかうな

zshまったく関係ないが

sort | uniq とかいうのを見ると

sort -u をつかえ。といつもツッコミそうになる。



オチは今思いつかないので後で思いついたら追記します。

ちなみに有限時間で思いつくかどうかは不明です。

というのがオチです。おわり。

fcpfcp 2007/02/20 04:04 お久しぶりです。 lurker さんの身の回りで不幸なことが起きていないことを願います……。
$ yes | head -n3 | xargs -n1 echo aaa
aaa y
aaa y
aaa y
すぐ下の例も同様です。

lurkerlurker 2007/02/20 10:09 あ、すいません。まちがえました。
そのあたり一度もコマンドとして実行してみてません!!
yes ’ ’ | head -n3 | xargs -L1 echo aaa
こうするべきでした。


俺の人生は完全に終わりました。
家族の命は時間の問題でしょうね。

lurkerlurker 2007/02/20 10:12 seqの方のサンプルは、まったくもって意味不明なことになってたので
記述から削除しました。ボクが削除されるのも時間の問題ですね。

fcpfcp 2007/02/20 10:36 xargs の -L オプションって知らなかったのですが、「yes ’ ’ | head -n3 | xargs -L1 echo aaa」だと 1 度しか実行されないようです……。
yes, head, xargs を組み合わせて指定回数実行する方法は、僕には「yes | head -n3 | xargs -I{} echo aaa」くらいしか思いつきません。
どれもこれも xargs のオプションが複雑すぎるせいということでどうでしょう。

lurkerlurker 2007/02/20 10:56 あれ、my環境だと動いてますよ。
john ~[14748]% yes ’’ | head -n3 | xargs -L1 echo aaa
aaa
aaa
aaa

lurkerlurker 2007/02/20 10:57 もちろんこれでも。
john ~[14752]% yes ’ ’ | head -n3 | xargs -L1 echo aaa
aaa
aaa
aaa

環境によって、-L オプションは -l オプションだったりしますが。

fcpfcp 2007/02/21 03:09 むむむ? 僕のところの Cygwin では -L1 でも -l1 でも 1 回しか動きません。
僕のところで man xargs を見ると、 -L max-lines は
Use at most max-lines nonblank input lines per command line. Trailing blanks cause an input line to be logically continued on the next input line. Implies -x.
だそうなので、この動作だと 1 回しか実行されないのは正しいように見えます。
できたら Cygwin を最新に上げたり他の OS で見てみたりします。

とりあえず zsh は非常に便利ということで。

lurkerlurker 2007/02/21 12:03 おお、linux,cygwinでやったら動作しませんでした。FreeBSD系のxargsだけっぽいです。