[JM:00515] Re: [POST:DO] bash bash.1

Back to archive index

長南洋一 cyoic****@maple*****
2011年 11月 26日 (土) 20:26:17 JST


長南です。

「パス名展開」サブセクションから、「展開」セクションの終わりまでです。

> .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" の訳が抜けて
ます。

"However, setting GLOBIGNORE to a non-null value" の "to a non-null
value" の訳も抜けています。

「ファイル名 "." と ".." は必ず無視されます。」は、ここで切らない方が
よいのではないかと思います。訳文におけるこの文と次の文は、いわば
"setting GLOBIGNORE ... enabling the dotglob ..." の但し書きで、
その但し書きが前に来ている形になっているからです。「ファイル名 "." と
".." が常に無視されるのは、GLOBIGNORE が空文字列以外に設定されていても
同じです (null は「空文字列」でよいですか)」ぐらいでしょうか。

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 になる。

> .\"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 は要らないでしょう。

"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" を省略して、一文にできます。

  ... 連続する二つの * を単独のパターンとして使用すると、その階層以下の、
  ディレクトリやサブディレクトリも含む全てのファイルにマッチすることに
  なります。

# 組み込みコマンド 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 文字のうちの、
任意の 1 文字」だということです。つまり、「両端の 2 文字」は「任意の
文字」とは別のものではなく、「任意の 1 文字」の候補に含まれるということ。

やっぱり、シーケンス式のところの訳し方を応用した方がよいかもしれません。
「ソート順で(その) 2 つの文字の間に並ぶ、その 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 文字にマッチ
します」ぐらいの方がわかりやすいかもしれません。単数は強調した方が
よいと思います。

> .\"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 標準で定義されている以下のクラスのいずれかです:

例のコロンです。

> .\"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 つに
マッチします」と簡潔に訳しておけば、十分な気がします。もちろん、
今のままでも問題ありません。

> \fB!(\fP\^\fIpattern-list\^\fP\fB)\fP
> .\"O Matches anything except one of the given patterns
> 与えられたパターンいずれにも含まれないもの全てにマッチします。

正しいのかもしれませんが、よくわからない表現です。「与えられたパターン
以外のいかなるものにもマッチします」で用が足りるのではないでしょうか。
one を省略せずに訳すのなら、「与えられたパターンのいずれもマッチしない、
あらゆるものにマッチします」でしょうか (この試訳の前半も、「が (も)」に
するか、「に (にも)」にするか、頭を悩ませるところです)。ちょっと実験
してみたところでは、この拡張パターンは空文字列にもマッチするようです。

-- 
長南洋一




linuxjm-discuss メーリングリストの案内
Back to archive index