csh系でのワイルドカード展開の謎(というより罠)
最近、香りがあるお茶(伊藤園のジャスミン茶、アサヒ飲料の香茶(シャンティー)プーアル茶)を好んで飲んでいるbonlifeです。csh使ってる時に、lsコマンドでアスタリスク(*)使ってファイルを表示しようとしたら、なんだか予想と違う動きですごくビックリしたのでメモしておきます。どうしてこういう動きになるのかご存知の方、是非とも教えてくださいませ。
まず、空ファイル aaa.txt を作ります。
> touch aaa.txt
lsで表示すると当然普通に表示できます。
> ls -l aaa.txt -rw-rw-r-- 1 user group 0 Apr 17 15:44 aaa.txt
続いて、引数に存在しないファイル bbb.txt も引数で指定してみます。当然、aaa.txt は表示され、 bbb.txt については存在しないよ!というメッセージが表示されます。
> ls -l aaa.txt bbb.txt ls: 0653-341 ファイル bbb.txt が存在しません。 -rw-rw-r-- 1 user group 0 Apr 17 15:44 aaa.txt
で、ここからです。あれ、bで始まるファイル確かあったよな、的なノリで aaa.txt と合わせて b* も指定してみます。ワイルドカードでの部分一致指定ですね。
> ls -l aaa.txt b* 一致していません.
オーマイコンブ!なんと、aaa.txt の情報も表示されず…。なんとまぁ…。これは場合によっては困っちゃいますです。
さらに不思議なのは…。
> ls -l a* b* -rw-rw-r-- 1 user group 0 Apr 17 15:44 aaa.txt
aaa.txt ではなく a* と b* を同時に引数指定すると、ちゃんと aaa.txt が表示されるじゃないの!いや、この動作には特に問題はないんですが、なんなんだろう、このモヤモヤした感じは。これってUNIX(Linux)ユーザの間では常識だったりするのでしょうか。
ちなみに、気になって少し試したり試してもらったりしたところ、tcsh、zshではcshと同じようにワイルドカードなしのファイル名とワイルドカードありのファイル名が混在しているケースで、ワイルドカードありの結果が存在しない場合、「No match.」となりました。(zshは奥が深そうなので、何か回避方法があるかもしれませんが。) /bin/shでお馴染みのBourne Shellやbashでは混在しているケースでも想定した通りの結果になりました。やっぱり漢は手堅くBourne Shell使っとけ、ってことかしら(違)。うぅ…。