cat a.out を防ぐ

今日は七夕だったようですが、あいにくの雨でした。

出力ファイルを全部つなごうと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

どういう仕組みになっているかというと、

  1. echo $@でいったんパス名を展開する(ワイルドカード*を展開する)
  2. seda.outを削除(ファイル名の部分文字列としてa.outを含むものが消えてしまわないようにする)
  3. a.outがなくなった引数をcatする(このcatは本物になります)

ファイル名にスペースが入っているとだめですが、そんな名前を付けることはまずないと思います。

$@$*の使い分けではスペースの問題は解決しないようです。

なんだか無駄が多いコードに見えるので、頭をひねってみたところ、trコマンドを使うと少しすっきりしそうです。

echo $@ | tr ' ' '\n' | grep -v ^a.out$

もっとうまい方法はあるのでしょうか……?