勝手にしやがれ Part2.

【投稿時の注意】
パスワード入力:必須。投稿後の削除時は同じパスワードを使います。
投稿者入力:いまのところ任意。入力を省略すると「名無しさん」がデフォルトで表示されます
Eメール入力:いまのところ任意。
リンクの入力:本文中に http の文字列が含まれると投稿出来ません。URL を貼るときは h 抜きで ttp:// とするなど工夫してみて下さい

2 / 13 ツリー ←次へ | 前へ→

【119】srepについて 文太 2008/10/07(火) 23:21

【149】Re:ワイルドカードの展開規則 文太 2008/10/22(水) 11:01
【151】Re:ワイルドカードの展開規則 Si 2008/10/23(木) 1:21
【153】Re:ワイルドカードの展開規則 文太 2008/10/24(金) 15:48
【154】Re:ワイルドカードの展開規則 文太 2008/10/25(土) 0:19
【156】Re:ワイルドカードの展開規則 としき 2008/10/25(土) 22:50
【157】Re:ワイルドカードの展開規則 文太 2008/10/25(土) 23:37
【161】Re:ワイルドカードの展開規則 文太 2008/10/27(月) 17:55
【152】Re:ワイルドカードの展開規則 文太 2008/10/23(木) 16:44

【149】Re:ワイルドカードの展開規則
 文太  - 2008/10/22(水) 11:01 -

引用なし
パスワード
    「*x*」という指定の仕方は cmd.exe 固有だったと思う。意味は、「ファイル
名の【どっかに】x を含むこと」だと思う。
 伝統的な command.com だと、「x*」なら「x」が生きるけど、「*x」では、
「*」によって「x」が殺されてしまい意味がなくなる、だったと思う。

 以下、例によってXP環境。

C:\XYZ>command.com /cdir *x*
ABC         0 08-10-18  16:31     #(1)「x」は死んでる
ABC   TXT     0 08-10-18  16:31     #(2)よってここで「x」がは
                        #生きてるように見えるかも
                        #しれないがそうではない
                        #だろう。
C:\XYZ>command.com /cdir *x*.*
ABC         0 08-10-18  16:31     #(3)間違いなく「x」は死ん
ABC   TXT     0 08-10-18  16:31     #でる。(4)もっと間違いなく
                        #「x」は死んでる

C:\XYZ>dir *x*                 #cmd.exe
2008 10 18 16:31         0 ABC.TXT   #(5)「x」が生きている
                        #ABCの方が出てこないから。
C:\XYZ>Wild -D "sed \"n\"" *x*
DEBUG MODE:sed "n" C:\XYZ\ABC          #えーと、これは読めません。
                        #いえ、読めました。
        #「*.*」と「*」の意味が違い、「.」が区切りとして機能する
        #場合、「*x*」は「*」の意味になり、「拡張子なしファイル」
        #=ベースファイルネームは何でもよい、となるのですね。
        #もちろん、「x」は死んでいる。

 結論:「*x*」で、cmd.exe と command.com と wild は【とても】違う。そも
そもそんな指定を許しているのは cmd だけで、それ以外は「.」の解釈が絡み、
錯綜する。ふつう使わないほうが混乱が少ないと思う。


 論理的読解で、辻褄を合わせるために「ずる」と抜け落ちがあるな、と実は思
っていますが、実用レベルではこんなところでどうでしょう? >誰か。

【151】Re:ワイルドカードの展開規則
 Si  - 2008/10/23(木) 1:21 -

引用なし
パスワード
   文太さんが熱心にやられているので簡単なファイル検索プログラムを書いてちょっと試してみました。

BC++5.02 で作成した 16bit 版の実行ファイルで XP上の "MS-DOSプロンプト"(CMD.EXE ではなく command.com を直接起動したもの)での実験結果では、
まさに、

>(例えば「p*」は「pqr.c」にはマッチしない)

が再現しました。

同じソースから作成した 32bit 版の実行ファイルではこのような挙動はなく、みなさんが書かれているような動作でした。

-----------------------

以下、既にご存じの部分もあるかも知れませんが・・・

1.Cコンパイラで作成した自作アプリの場合
コマンドライン引数に指定されたワイルドカードはそのままの文字列として実行ファイルに渡されます(註1)。
で、ワイルドカード(を含む文字列)を対象にした実際のファイル検索は、コンパイラ固有の関数(findfirst や _dos_findfirst)、あるいは WIN32API (FindFirstFile)を使って行われます。
ということは、引数に指定されたワイルドカードをアプリ側でどう扱うのか?はコンパイラ依存の部分もあるのではないと思うのです(きちんと検証した訳ではないのであくまで仮説です)。

(註1)LSI-C試食版の場合はちょっと違って、デフォルトの動作ではワイルドカードは展開された状態でアプリに渡されます。これを抑制するのには noexpand.obj をコンパイル時にリンクします。

2.OSの内部コマンド、付属外部コマンドの場合
おそらく 100% OSの仕様による、と言うところではないでしょうか(これもきちんと検証した訳ではありません)。

【152】Re:ワイルドカードの展開規則
 文太  - 2008/10/23(木) 16:44 -

引用なし
パスワード
   >  「*x*」という指定の仕方は cmd.exe 固有だったと思う。

 いちおう訂正。「cmd.exe 固有」というより、Windows95のLFNサポート時
からだそうです。また、これに絡み、いちおう以下を追記しておきます。LFNの
エイリアス(SFN)でも当たるから注意してね、という話。そのディレクトリ
環境によっては、「長いファイル名.txt」が「長いフ~1.txt」になったりすること
がありますが、この「1」もヒットするからね、ということ。そして、「~1」は
Windowsが勝手につけるのでなおさら注意とのこと。(出典:天野司『WindowsDos
プロンプトポケット・リファレンス』、同『WindowsXP/2000コマンドプロンプト
ポケット・リファレンス』)

【153】Re:ワイルドカードの展開規則
 文太  - 2008/10/24(金) 15:48 -

引用なし
パスワード
   Siさん、m(__)m

>  文太さんが熱心にやられているので簡単なファイル検索プログラムを書いてち
> ょっと試してみました。

 わざわざどうもありがとうございます。m(__)m

> >(例えば「p*」は「pqr.c」にはマッチしない)
> が再現しました。

 Siさんが推測されているように「処理系」依存なのでしょうね。それでも、上は
MS-DOS環境では、それほど古いことでも珍しいことでもないようです(正直言って、
「.」を区切り文字と認識するwild.(com|exe)の仕様のほうが分かりやすいと思う。
とりわけLFNに個人的にやっかいになることが少ないと。とはいえ、a.b.c.dなん
てファイル名を許すとなると、過去との互換性はぐちゃぐちゃになるでしょうね。)

------------------------------------------------
C:\XYZ>Command.com /cType abc      #拡張子なしが(1)
aaa

C:\XYZ>Command.com /cType abc.txt    #拡張子ありが(2)
aa

#GNU sed version 1.18 + multi-byte extension 1.03
C:\XYZ>sed "s/a/b/g" *         #(1) matched
bbb

C:\XYZ>sed "s/a/b/g" *.*        #(1)(2) both matched
bbb
bb

#serow版
C:\XYZ>oldsed "s/a/b/g" *        #(1) matched
bbb

C:\XYZ>oldsed "s/a/b/g" *.*       #(1)(2) both matched
bbb
bb

C:\XYZ>Jgawk "{gsub(/a/,\"b\");print}" *    #(1) matched
bbb

C:\XYZ>Jgawk "{gsub(/a/,\"b\");print}" *.*   #(1)(2) both matched
bbb
bb

C:\XYZ>Jperl4 -pe "s/a/b/g" *      #(1) matched
bbb

C:\XYZ>Jperl4 -pe "s/a/b/g" *.*     #(1)(2) both matched
bbb
bb
------------------------------------------------

 なんだか当たり前のことを検証しているような気がしてきた…。
 あるいは、僕が問題を途中で間違った方向に引っぱってしまったか…。
 command.com and cmd.exe@XPが、MS-DOS的観点からすると、やっぱ特殊
なんではないでしょうかねぇ。
 そしてSiさんが教えてくれたように、32ビットなWindowsAPIの世界では、
cmd.exe的解釈が標準であると。
 となると、やはり2つの世界に引き裂かれているcommand.comが一番ぐちゃ
ぐちゃであると。違うかな。いや、一般化しなければ、command.com@XPは、
彼(女)自身とても大変そうであるばかりでなく、使うのも大変だ、と。

 一番最初に戻ると新出さんが言うことには、けっこう一般妥当性がありそうだ。
とはいえ、(まただ)モバなMS-DOS6, command.comがあったなぁ…。あいつも
相当ぐちゃぐちゃしてたなぁ…。

【154】Re:ワイルドカードの展開規則
 文太  - 2008/10/25(土) 0:19 -

引用なし
パスワード
    しつこいですね。すいません。とりわけSiさんとすれば、wildのことを除けば、
おそらくすごく興味がある話題でもないでしょうし。m(__)m

 ただ、ふと思いついてしまったのです。
 いえ、sed, awk, perlのDos日本語版移植はすべてserowさんがされているわ
けで、それらが違うほうが変だな、と。
 (もっともserowさんの影響を受けないでグレップの開発もなかったみたいで
はありますが…。)

 Dos環境ではワイルドカードの展開がそれぞれのツールにまかされていると
すると(これが最大のニュース)、もう、必要な場面で、逐一やるしかないので
すが、基準があると何が特殊か分かると思い、これだけはやっておこうと思った
グレップたちです。(command.comが「特殊」に分類されてしまったりする…。)
 どうやら、新出さんが正しいですね。ま、その後のことはともかく、思いっき
り間違ったことを書く人のわけはないですから。ワイルドも正しいです!

-------------------------------------------------
C:\XYZ>Command.com /cType abc
aaa

C:\XYZ>Command.com /cType abc.txt
aa

C:\XYZ>cgrep -t "aa" *        #wildcardさえマッチすれば両方
abc 1:aaa            #グレップされる検索パターン

C:\XYZ>cgrep -t "aa" *.*
abc 1:aaa
abc.txt 1:aa

C:\XYZ>ygrep -t "aa" *
abc    1:aaa

C:\XYZ>ygrep -t "aa" *.*
abc    1:aaa
abc.txt    1:aa

C:\XYZ>izgrep -t "aa" *
ABC 1:aaa

C:\XYZ>izgrep -t "aa" *.*
ABC 1:aaa
ABC.TXT 1:aa

C:\XYZ>grep "aa" *
aaa

C:\XYZ>grep "aa" *.*
ABC:aaa
ABC.TXT:aa

C:\XYZ>Command.com /cDir \bin\grep
GREP   EXE   90959 94-06-02  18:50

C:\XYZ>cgrepb "aa" *        #Bruce.さん版
aaa

C:\XYZ>cgrepb "aa" *.*
abc:aaa
abc.txt:aa

C:\XYZ>yagrep "aa" *        #32bit grep (by Bruce.さん)
ABC:aaa                #きっとWin APIがwildcard展開を担当
ABC.TXT:aa

C:\XYZ>yagrep "aa" *.*
ABC:aaa
ABC.TXT:aa
-------------------------------------------------

【156】Re:ワイルドカードの展開規則
 としき WEB  - 2008/10/25(土) 22:50 -

引用なし
パスワード
   いくつか。

> Dos環境ではワイルドカードの展開がそれぞれのツールにまかされていると

現実的には問題ないとは言え、実はこれは最大の問題だったりする。
ソースが公開されているフリーウェアの場合、ものによっては、複数の処理系に
対応していたりするわけです。さらに、それぞれの処理系用のmakefileまで同梱
されていたりして。
そういう場合、DOSの時代の国産ソフトだと、たいがいはMS-C(or Quick C)とTurbo C(or Borland C)とLSI C-86ですが、配布されている実行ファイルをそのま
ま使っているうちはいいけれど、手持ちの処理系でコンパイルしなおしたら挙動
が違う、なんて事はありそうな話。


もう一つ、#136であった話ですが。

> 注意せよ。DOS本来のワイルドカード解釈では「*」は、ファイル名
> の本体および拡張子のそれぞれの中において、「*」以降の文字列照
> 合をしない、という意味を持っており(例えば「p*」は「pqr.c」に
> はマッチしない)

前段については、DOSの仕様として明記されている話のようです。
以下、NEC版MS-DOS5.0Aユーザーズリファレンスマニュアルより引用。

> アスタリスク(*)は、ファイル名の名前と拡張子の中で、それ以降が“1文
> 字以上の任意の文字列”を表すワイルドカードです。

ところで、手元には、ASCII出版局の「標準MS-DOSハンドブック」があります。
序文によると、この本は、さらに古いDOS2.0を対象に書かれています。なにせ、
84年が初版です。この本では、単純に

> "*"は、任意の複数文字とマッチします。

としか書かれていません。
ただ、この本の後ろの方には、重要な記述がありました。

> "*"はユーザープログラムまたはシステムコールによって"?"に展開しなければ
> ならない

これらから、以下は推測。
仕様としては、「*」は「????????.」に展開されるべきであった。ところが、な
ぜかシステムコールでは「????????.???」に展開されてしまっている。


おまけ。
参考というか、検証すればすぐわかる事なんですが。
今回、文太さん、「*」というワイルドカードについて調べています。
が、「*.」というワイルドカード指定であれば、多分、もっと安定な結果が得ら
れるのではないかと思います。

【157】Re:ワイルドカードの展開規則
 文太  - 2008/10/25(土) 23:37 -

引用なし
パスワード
   としきさん

 正確なところのフォローありがとうございます。全体に納得のいく話でした。

>> Dos環境ではワイルドカードの展開がそれぞれのツールにまかされていると
>現実的には問題ないとは言え、実はこれは最大の問題だったりする。
>手持ちの処理系でコンパイルしなおしたら挙動
>が違う、なんて事はありそうな話。
 実際上は試しようもありませんが、十分あり得ますね、きっと。

> 「標準MS-DOSハンドブック」
 Dos3対応版を数日前から探しています。引っ越しで捨てたのかなぁ。ったく。

>> "*"はユーザープログラムまたはシステムコールによって"?"に展開しなければ
>> ならない
>これらから、以下は推測。
>仕様としては、「*」は「????????.」に展開されるべきであった。ところが、な
>ぜかシステムコールでは「????????.???」に展開されてしまっている。

 これはやる気があれば調べられるはずですが、 はい、「* は単純に ? 複数個
に展開されて処理されており」という記述は見ました。きっとそうでしょう。

> 今回、文太さん、「*」というワイルドカードについて調べています。
> が、「*.」というワイルドカード指定であれば、多分、もっと安定な結果が得ら
> れるのではないかと思います。

 はい、その後そう気づいておりました。「文太さん的にはこう考え・調べるべき」
アドバイスありがとうございます。Dosレベルで(昔から)「foo.」というファ
イル名が許されているので(さすがに、fooの存在するディレクトリで共存はできま
せんが)。ありがとうございました。m(__)m

【161】Re:ワイルドカードの展開規則
 文太  - 2008/10/27(月) 17:55 -

引用なし
パスワード
   としきさん

> おまけ。
> 参考というか、検証すればすぐわかる事なんですが。
> 今回、文太さん、「*」というワイルドカードについて調べています。
> が、「*.」というワイルドカード指定であれば、多分、もっと安定な結果が得ら
> れるのではないかと思います。

 「サービスだぞ」って、わざわざ教えてくれているのに反応がとろくてすいま
せん。「え? 不定ではないけど…」とか思ってたりして。あう、あう。はい、
「*」を「*.」にしましたところ、直観からずれると思われていた command.com,
cmd.exe, ssed, egsed, mbsed, onigsed, yagrep, gawk, mawk32, tosfind のす
べてにおいて「拡張子なし」のファイルだけにマッチさせられました。32ビッ
ト・ツールを使うときにはこれでいきます。っていっても、拡張子のないファイ
ルつくらないし、それだけを選んで処理するということは、現実的にはなさそう
ですけどね。
 ま、人生長いので、これから先どうなるかなんて分かりません。転ばぬ先の、
ですね。多謝。m(__)m

2 / 13 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
14,005
(SS)C-BOARD v3.8 is Free