Masakazu Takahashi
emasa****@gmail*****
2011年 11月 30日 (水) 21:08:19 JST
こんにちは。 2011/11/26 長南洋一 <cyoic****@maple*****>: > 「パス名展開」サブセクションから、「展開」セクションの終わりまでです。 レビューありがとうございます。以下のとおり変更しました。 https://github.com/emasaka/bash-jman/commit/1420a34a9ed87d8578e2a795a22fdd79de361cc3 >> .SS パス名展開 > >> .\"O The file names >> .\"O .B ``.'' >> .\"O and >> .\"O .B ``..'' >> .\"O are always ignored when >> .\"O .B GLOBIGNORE >> .\"O is set and not null. However, setting >> .\"O .SM >> .\"O .B GLOBIGNORE >> .\"O to a non-null value has the effect of enabling the >> .\"O .B dotglob >> .\"O shell option, so all other file names beginning with a >> .\"O .B ``.'' >> .\"O will match. >> ファイル名 >> .B ``.'' >> と >> .B ``..'' >> は必ず無視されます。これは >> .SM >> .B GLOBIGNORE >> が設定されていても同じです。しかし、 >> .SM >> .B GLOBIGNORE >> を設定するとシェルオプションの >> .B dotglob >> が有効になるので、 >> .B ``.'' >> で始まるほかのファイル名は全てマッチします。 > > "when GLOBIGNORE is set and not null" の "and not null" の訳が抜けて > ます。 「GLOBIGNORE が設定されていても」を「GLOBIGNORE に空でない値が設定され ていても」に変更しました。 > "However, setting GLOBIGNORE to a non-null value" の "to a non-null > value" の訳も抜けています。 「GLOBIGNORE に値を」を「GLOBIGNORE に空でない値を」に変更しました。 > 「ファイル名 "." と ".." は必ず無視されます。」は、ここで切らない方が > よいのではないかと思います。訳文におけるこの文と次の文は、いわば > "setting GLOBIGNORE ... enabling the dotglob ..." の但し書きで、 > その但し書きが前に来ている形になっているからです。「ファイル名 "." と > ".." が常に無視されるのは、GLOBIGNORE が空文字列以外に設定されていても > 同じです (null は「空文字列」でよいですか)」ぐらいでしょうか。 「ファイル名 "." と ".." は GLOBIGNORE に 〜 必ず無視されます」 と 1 文にしました。 > However は「しかし」よりもっと強く訳した方がよいかもしれません。 > >> .\"O The >> .\"O .B dotglob >> .\"O option is disabled when >> .\"O .B GLOBIGNORE >> .\"O is unset. > >> .B GLOBIGNORE >> が設定されていなければ、 >> .B dotglob >> オプションは無効になります。 > > ここは、原稿では原文と訳文の順序が逆になっています。 > > "The dotglob option is disabled when GLOBIGNORE is unset." の > unset は、「unset する」の方だと思います。こんなふうになりますから。 > > $ echo $GLOBIGNORE > # デフォルトでは GLOBIGNORE は設定されていない。 > $ shopt |grep dot > dotglob off # デフォルトでは dotglob は off である。 > $ GLOBIGNORE="" > $ shopt |grep dot > dotglob off # GLOBIGNORE に null を設定しても on にならない。 > $ GLOBIGNORE="*.mem" > $ shopt |grep dot > dotglob on # null 以外を設定すると dotglob が on になる。 > $ GLOBIGNORE="" > $ shopt |grep dot > dotglob on # すでに on だと、GLOBIGNORE="" で off にならない。 > $ unset GLOBIGNORE > $ shopt |grep dot > dotglob off # unset すると off になる。 「が設定されていなければ」を「を unset すると」に変更しました。 >> .\"O \fBPattern Matching\fP >> \fBパターンマッチング\fP >> .PP >> .\"O Any character that appears in a pattern, other than the special pattern >> .\"O characters described below, matches itself. The NUL character may not >> .\"O occur in a pattern. A backslash escapes the following character; the >> .\"O escaping backslash is discarded when matching. >> .\"O The special pattern characters must be quoted if >> .\"O they are to be matched literally. >> パターンに含まれる文字のうち、後述する特殊パターン文字以外の文字は、 >> 自分自身にマッチします。NUL 文字がパターン中に現われてはいけません。 >> バックスラッシュは特殊パターン文字をエスケープします。 >> バックスラッシュ自身はマッチングに使われません。 >> 特殊パターン文字をその文字そのものにマッチさせるためには、 >> クォートしなければなりません。 > > 「後述する特殊パターン文字以外の文字」の「後述」は、すぐ下で特殊文字を > 列挙しているのですから、「下記の」だと思います。「後述」だと、かなり > 離れた後の方、という印象があります。 「後述する」を「以下の」(ほかの箇所の表記に揃えた)に変更しました。 > the following characters ではなく、the following character と単数ですから、 > 「下記の文字」つまり「特殊パターン文字」ではなく、「直続の (一) 文字」 > 「直後の (一) 文字」です。普通の文字だって、バックスラッシュでエスケープ > できるのですし。 「特殊パターン文字」を「直後の文字」に変更しました > "the escaping backslash is discarded" を「バックスラッシュ自身は > マッチングに使われません」と訳したのは、考えた末の訳だと思いますが、 > "ab\\cd" などと '\' をエスケープすれば、マッチングに使えますから、 > 正確とは言えません。"A backslash escapes the following character; > the escaping backslash is discarded" とセミコロンで文がつながって > いるので、この the は前半の文の A backslash を指しているのだと思います。 > > 原文にそっておとなしく訳せば、 > > バックスラッシュはすぐ後に続く文字をエスケープします。エスケープに > 使うこのバックスラッシュは、マッチングの際に捨てられます (外されます)。 > > このマニュアルのほかの部分で、'\' を「エスケープ文字」と呼んでいるので、 > それを使って書き換えてみます。 > > ... エスケープ文字のバックスラッシュは、マッチングの際に捨てられます。 > > あるいは、the の前方参照を escaping を過去形に訳すことで表現して、 > > ... マッチングは、エスケープに使用したバックスラッシュを外してから、 > 行われます。 > > あるいは「エスケープのバックスラッシュ」ですまして、 > > ... マッチングの際には、エスケープのバックスラッシュは無視されます。 > > いろんな訳し方が考えられます。御工夫ください。 「このバックスラッシュは、マッチングでは無視されます」と変更しました。 >> .B * >> .\"O Matches any string, including the null string. >> .\"O When the \fBglobstar\fP shell option is enabled, and \fB*\fP is used in >> .\"O a pathname expansion context, two adjacent \fB*\fPs used as a single >> .\"O pattern will match all files and zero or more directories and >> .\"O subdirectories. >> .\"O If followed by a \fB/\fP, two adjacent \fB*\fPs will match only directories >> .\"O and subdirectories. >> 空文字列を含む、任意の文字列にマッチします。 >> シェルオプション \fBglobstar\fP が有効で、 >> \fB*\fP がパス名展開に用いられる場面では、 >> 2 つ連続した \fB*\fPs が 1 つのパターンとして使われると、 >> 0 レベル以上のディレクトリやサブディレクトリの全てのファイルにマッチします >> 2 つ連続した \fB*\fPs の後に \fB/\fP が続く場合には、 >> ディレクトリとサブディレクトリのみにマッチします。 > > 「*s」の s は要らないでしょう。 「s」を削りました。 > "two adjacent *s used as a single pattern" の "a single pattern" > というのは、具体的にどういうことでしょうか。 > > 「パス名展開」の冒頭に、 > > ... 単語分割を行った後に bash はそれぞれの単語が *, ?, [ を含んで > いるかどうか調べます。これらの文字のいずれかが見つかると、その単語は > パターンとみなされ (then the word is regarded as a pattern)、 > パターンにマッチするファイル名をアルファベット順にソートしたリストに > 置換されます。 > > と書いてあります。とすると、*.txt のようなものだけでなく、/usr/share/ > man/man1/*.1.gz なども一つのパターンなわけです。デフォルトでは > 単語分割は<スペース>、<タブ>、<改行> で行われるので、'/' は単語の > 区切りになりませんから。 > > "two adjacent *s used as a single pattern" というのは、次のうちの > どっちなんでしょう。 > > 1) パスを前置したり、拡張子を後置したりせず、たとえば、 "echo **" と > いうふうに、** だけを使う。 > 2) /usr/share/man/man** には当てはまらないが、/usr/share/man/** や > /usr/share/**/a?.1.gz には当てはまる。 > > 実験してみたところでは、どうやら、2) のようです。 > そうすると、このパラグラフでは、/usr/share/man/man1/*.1.gz や > /usr/share/**/a?.1.gz を一つのパターンとは見なしていないのでしょうか。 > それとも、"a pattern" と "a single patterm" を厳密に区別しているので > しょうか。 > > それでは、"a single pattern" はどう訳したらよいのでしょう。一応は > 「単独の」「独立した」などと訳せますけれど。 > > さて、" ... will match all files and zero or more directories and > subdirectories." は、はっきり言って、原文の説明が下手です。 > それで、この文を翻訳するのがとても難しくなっているのだと思います。 > > ですから、高橋さんが実際の動作を考えた上で、「0 レベル以上の > ディレクトリやサブディレクトリの全てのファイルにマッチします」と、 > 工夫なさったのもよくわかります。しかし、原文から離れていることは、 > 原文の出来が悪い以上、仕方がないにしても、一般のユーザには > 「0 レベル以上のディレクトリ」が理解できないだろうと思います。 > > では、どう訳したらよいのか。一応、こんなのを思いつきました。 > "zero or more" は 0 個以上ですから、「存在すれば、それを」と言い換え > られます。「その階層以下の」は補足です。 > > ... 連続する二つの * を単独のパターンとして使用すると、その階層以下の > 全てのファイルにマッチすることになります。ディレクトリやサブディレクトリ > が存在すれば、それも含めて全てのファイルにマッチするわけです。 > > 「ディレクトリやサブディレクトリも含む」と言えば、 (細かいことを言うと、 > 「を」ではなく「も」であることで)、「ディレクトリやサブディレクトリは > あってもなくてもよい」と暗示することになる、と考えることができるなら、 > "zero or more" を省略して、一文にできます。 > > ... 連続する二つの * を単独のパターンとして使用すると、その階層以下の、 > ディレクトリやサブディレクトリも含む全てのファイルにマッチすることに > なります。 提示されている問題点を整理します。 (1) “a single pattern”は、動作としては“/**/foo”のように“/”で区切 られた 1 つのパターンを指すが、言葉としては“man**”も指すように見えて、 曖昧 (2) 「0 レベル以上のディレクトリ」という言葉の意味がわからない まず、(1) については「連続する 2 つの * だけのパターン」と変更しました。 “/”で区切られているというニュアンスは、上で「パス名のマッチングを行う とき、スラッシュ文字は必ず明示的にマッチさせなければなりません」とある ことで代用しておきます。 また、(2) については、長南さんの訳をベースに、「ディレクトリ」と「サブ ディレクトリ」の区別を意識して、以下のとおり変更しました。 その階層以下のディレクトリとそのサブディレクトリ、そこにある全ての ファイルにマッチします。 同様に、その下の **/ の説明も「ディレクトリとそのサブディレクトリ」に変 更しました。 > # 組み込みコマンド shopt のオプションに globstar があり、その説明文が > # こことほぼ同文なので、元木さんが「組み込みコマンド」セクションの > # チェックでどうおっしゃっているか、早く見たいなと思っています。 > >> .B [...] >> .\"O Matches any one of the enclosed characters. A pair of characters >> .\"O separated by a hyphen denotes a >> .\"O \fIrange expression\fP; >> .\"O any character that sorts between those two characters, inclusive, >> .\"O using the current locale's collating sequence and character set, >> .\"O is matched. If the first character following the >> 括られた文字のうち任意の 1 文字にマッチします。 >> 2 つの文字の間にハイフンを入れたものは、 >> .I 範囲表現 (range expresion) >> を表します。ソート順で 2 つの文字の間にある任意の文字と、 >> 両端の 2 文字がマッチします。 >> ソートには現在のロケールの照合順序 (collating sequance) >> と文字セットが用いられます。 > > 細かいことですが、「括られた」という表現は、「〜で括られた」としないと、 > 舌足らずな気がします。「ブラケットで囲まれた」や「ブラケットに含まれる」 > といった言い方もあります。 > > 「ソート順で 2 つの文字の間にある任意の文字と、両端の 2 文字がマッチ > します」は、厳密に言うと、不正確です。 > > まず第一に、この特殊パターン文字の説明では、"* matches any string."、 > "[...] matches any one of the enclosed characters." というふうに、 > 「この記号は (実際のパス名中の) 以下のような文字や文字列にマッチする」 > という考え方をしています。ですから、ここは、能動態に書き直せば、 > "[...] matches any character ..."であり、「any character が [...] に > マッチする」のではなく、「[...] が any character にマッチする」という > 関係になります。もっとも、match という動詞には曖昧なところがあって、 > "A matches B" と言っても、"B matches A" と言っても、結局同じじゃないか、 > と言えば、そのとおりなのですけれど。 上記 2 点については、ここでは主語が [...] なので、問題ないと考えます。 > 二番目は、「ソート順で 2 つの文字の間にある任意の文字と、両端の2 文字」 > ではなく、「ソート順で 2 つの文字の間にある文字と、両端の 2 文字のうちの、 > 任意の 1 文字」だということです。つまり、「両端の 2 文字」は「任意の > 文字」とは別のものではなく、「任意の 1 文字」の候補に含まれるということ。 > > やっぱり、シーケンス式のところの訳し方を応用した方がよいかもしれません。 > 「ソート順で(その) 2 つの文字の間に並ぶ、その 2 文字を含む任意の 1 文字に > マッチします」くらいでしょうか。 シーケンス式の訳を応用する、ということで、「ソート順で 2 つの文字の間に ある両端を含む任意の 1 文字」と変更しました。 >> .\"O is matched. If the first character following the > >> .B [ >> .\"O is a >> .\"O .B ! >> .\"O or a >> .\"O .B ^ >> .\"O then any character not enclosed is matched. >> の次の文字が >> .B ! >> または >> .B ^ >> ならば、括られた文字に含まれない任意の文字がマッチします。 > > ここも、上に述べたように、「がマッチする」ではなく、「にマッチする」 > の方が正確です。 > > 「ブラケットに囲まれた (含まれる) 文字以外の任意の 1 文字にマッチ > します」ぐらいの方がわかりやすいかもしれません。単数は強調した方が > よいと思います。 「〜任意の 1 文字にマッチします」と変更しました。 >> .\"O Within >> .\"O .B [ >> .\"O and >> .\"O .BR ] , >> .\"O \fIcharacter classes\fP can be specified using the syntax >> .\"O \fB[:\fP\fIclass\fP\fB:]\fP, where \fIclass\fP is one of the >> .\"O following classes defined in the POSIX standard: >> .B [ >> と >> .B ] >> の間では、\fI文字クラス (character classes)\fP を指定できます。 >> 指定には \fB[:\fP\fIclass\fP\fB:]\fP という記法を使います。ここで >> \fIclass\fP は POSIX 標準で定義されている以下のクラスのいずれかです: > > 例のコロンです。 この問題に関する私の意見は [JM:00508] で書いたとおりです。 http://sourceforge.jp/projects/linuxjm/lists/archive/discuss/2011-November/000507.html >> .\"O Within >> .\"O .B [ >> .\"O and >> .\"O .BR ] , >> .\"O an \fIequivalence class\fP can be specified using the syntax >> .\"O \fB[=\fP\fIc\fP\fB=]\fP, which matches all characters with the >> .\"O same collation weight (as defined by the current locale) as >> .\"O the character \fIc\fP. >> .B [ >> と >> .B ] >> の間では、\fI同値クラス (equivalence class)\fP を指定できます。 >> 指定には \fB[=\fP\fIc\fP\fB=]\fP という記法を使います。 >> これは現在のロケールにおける定義において \fIc\fP と同じ >> 照合重さ (collation weight) を持つ全ての文字にマッチします。 > > 例の「同値クラス」「等価クラス」です。 前に合わせて「等値クラス」に変更しました。 > collation weight には定訳がないのだろうかと思って、Google で捜してみたら、 > 「情報分野規格の利用促進に関する標準化、成果報告書」(日本規格協会、 > 情報技術標準化研究センター、平成 22 年 3 月) というのが見つかりました。 > その「付属書 B 国際 (ISO/IEC JTCI JIS 等) 用語・定義情報 (試行)」では、 > > 照合(重み付け)表: collation (weighting) table > (照合)重み: (collation) weight > > というふうになっていました。 「照合重さ」を「照合重み」に変更しました。 >> \fB@(\fP\^\fIpattern-list\^\fP\fB)\fP >> .\"O Matches one of the given patterns >> 与えられたパターンのうち 1 つだけにマッチします。 > > これは一番普通のパターンマッチなので、「与えられたパターンの 1 つに > マッチします」と簡潔に訳しておけば、十分な気がします。もちろん、 > 今のままでも問題ありません。 ちなみに、ふと前後の項目を考えると、元訳は、間違ってはいませんが言い足 りてませんね。以下のように変更しました。 与えられたパターンに 1 回だけマッチします。 >> \fB!(\fP\^\fIpattern-list\^\fP\fB)\fP >> .\"O Matches anything except one of the given patterns >> 与えられたパターンいずれにも含まれないもの全てにマッチします。 > > 正しいのかもしれませんが、よくわからない表現です。「与えられたパターン > 以外のいかなるものにもマッチします」で用が足りるのではないでしょうか。 > one を省略せずに訳すのなら、「与えられたパターンのいずれもマッチしない、 > あらゆるものにマッチします」でしょうか (この試訳の前半も、「が (も)」に > するか、「に (にも)」にするか、頭を悩ませるところです)。ちょっと実験 > してみたところでは、この拡張パターンは空文字列にもマッチするようです。 以下のとおり変更しました。 与えられたパターンのどれでもないものにマッチします。 -- Masakazu Takahashi (emasaka)