今日は七夕だったようですが、あいにくの雨でした。
出力ファイルを全部つなごうとcat *.out
と打ったところ、a.out
も巻き込まれてコンソールが大変なことになりました。
このミスは二回目なので、対策することにしました。
あまりうまい方法が思いつきませんでしたが、以下のようにしました。
- まず、
.bashrc
や.bash_alias
などに、alias cat='~/.cat'
と書くことで、cat
コマンドではなく自作の~/.cat
というスクリプトが呼び出されるようにする - その呼び出される
~/.cat
は以下のようにする
#!/bin/bash args=$(echo $@ | sed -e 's/^a.out / /' -e 's/ a.out / /' -e 's/ a.out$//' -e 's/^a.out$//') cat $args
どういう仕組みになっているかというと、
echo $@
でいったんパス名を展開する(ワイルドカードの*
を展開する)sed
でa.out
を削除(ファイル名の部分文字列としてa.out
を含むものが消えてしまわないようにする)a.out
がなくなった引数をcat
する(このcat
は本物になります)
ファイル名にスペースが入っているとだめですが、そんな名前を付けることはまずないと思います。
$@
と$*
の使い分けではスペースの問題は解決しないようです。
なんだか無駄が多いコードに見えるので、頭をひねってみたところ、tr
コマンドを使うと少しすっきりしそうです。
echo $@ | tr ' ' '\n' | grep -v ^a.out$
もっとうまい方法はあるのでしょうか……?