今日は七夕だったようですが、あいにくの雨でした。
出力ファイルを全部つなごうと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$
もっとうまい方法はあるのでしょうか……?