Hatena::ブログ(Diary)

bonlife このページをアンテナに追加 RSSフィード

言及ISBN/ASIN
  • Ringo EXPO 08 [DVD]
  • 三文ゴシップ
  • my way
  • ビジネスパーソンのための話し方入門 (日経文庫)
  • ザ・グーグルウェイ グーグルを成功へ導いた型破りな戦略
  • 考え・書き・話す3つの魔法
  • 自分の答えのつくりかた―INDEPENDENT MIND

2007-04-17 電話での問合せはやめてください。

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)ユーザの間では常識だったりするのでしょうか。

ちなみに、気になって少し試したり試してもらったりしたところ、tcshzshではcshと同じようにワイルドカードなしのファイル名とワイルドカードありのファイル名が混在しているケースで、ワイルドカードありの結果が存在しない場合、「No match.」となりました。(zshは奥が深そうなので、何か回避方法があるかもしれませんが。) /bin/shでお馴染みのBourne Shellbashでは混在しているケースでも想定した通りの結果になりました。やっぱり漢は手堅くBourne Shell使っとけ、ってことかしら(違)。うぅ…。

ayokoyamaayokoyama 2007/04/18 17:53 こんにちは。Bash 使いなのであまり気にしたことないのですが、C shell では、パターンマッチが一つも成功しなかった場合、コマンドを起動しないまま、シェル内でエラーになってしまうようです。次のようなシェルスクリプト書いて試すと良く分かります。
#!/bin/sh
echo ’executed.’
echo $1
echo $2
ちなみに BSD Unix の C shell のマニュアルには、こうありますね。どうも仕様みたいです。
In a list of words specifying filename substitution it is an error for no pattern to match an existing file name, but it is not required for each pattern to match.

bonlifebonlife 2007/04/18 22:02 コメントどうもです!
C shellのマニュアルにもそんな記述がありましたか。
なんだかイヤな感じですが、皆さん気にしてないようですし、「そういう仕様」として受け入れるしかないみたいですね。
知っていれば変なシェルスクリプトを書かないで済みそうだし、深くは考えないことにします。

ayokoyamaayokoyama 2007/04/18 23:12 シェルプログラミングには、C shell は使わないほうが良いらしいです。私は詳しくないので、耳知識だけですが。(^^)
参考: http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/csh-whynot.euc

bonlifebonlife 2007/04/18 23:39 コメントありがとうございます。
私も日ごろはシェルスクリプトはcshで書かないようにしてます。
Bourne Shellです。硬派です!(違)

ほぴほぴ 2016/09/30 17:11 対処を知りたくて検索したらここが1番目だったので
せっかくだから5番目でみつけた答えを書いときますね
set nonomatch

ちなみに私は決してcshスクリプトなんか書きませんが
アホ管理者がログインシェルをcshにしてしまっているアカウントにsshでコマンドを投げるときに必要だったりします

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/bonlife/20070417/1176794293