[JM:00505] Re: [POST:DO] bash bash.1 (EXPANSION 2)

Back to archive index

長南洋一 cyoic****@maple*****
2011年 11月 20日 (日) 12:49:47 JST


長南です。

「パラメータの展開」から「単語の分割」までです。

> .SS パラメータの展開

> .\"O When braces are used, the matching ending brace is the first `\fB}\fP'
> .\"O not escaped by a backslash or within a quoted string, and not within an
> .\"O embedded arithmetic expansion, command substitution, or parameter
> .\"O expansion.
> ブレースを使った場合、マッチングを終えるブレースは最初の `\fB}\fP' です。
> ただしバックスラッシュでエスケープされているものや
> クォートされている文字列中のものは含まれませんし、
> 算術式展開やコマンド置換、パラメータ展開に入っているものも含まれません。

まだパラメータ展開におけるマッチングにまで話が進んでいませんから、
matching ending brace の match は「対になる」の意味だと思います。
ですから、「マッチングを終えるブレースは」ではなく、「対になる
閉じブレースは」でしょう。ほかの場所では「閉じブレース」を
closing brace と言っていますが、colosing brace も ending brace も
同じことでしょう。

「最初の '}'」も、「最初に現れる '}'」と言った方がよさそうです。 

"and not within an embedded arithmetic expansion" 以下ですが、"within
an embedded arithmetic expansion" というのは、たとえば、こういう場合の
${BBB} の '}' のことでしょうか。

  $ BBB=10; echo ${AAA:-$((2 + ${BBB}))}

訳文で省略されている embedded を訳すならば、「ブレースの内側にある」
ぐらいでしょうか。パラメータ展開の話をしているのに、「パラメータ展開に
入っているものも含まれません」というのは、考えてみると変な話なので、
やはり embedded は訳しておくべきだろうと思います。

どんな感じになるか、書き変えた文章を挙げておきます。

  ブレースを使った場合、対になる閉じブレースは最初に現れる '}' です。
  ただしバックスラッシュでエスケープされているものやクォートされている
  文字列中のものは、これに当てはまりませんし、ブレースの内側にある
  算術式展開やコマンド置換、パラメータ展開で使われているもの (閉じ
  ブレース) も当てはまりません。
 
> ${\fIparameter\fP}
> .\"O The value of \fIparameter\fP is substituted.  The braces are required
> .\"O when
> .\"O .I parameter
> .\"O is a positional parameter with more than one digit,
> .\"O or when
> .\"O .I parameter
> .\"O is followed by a character which is not to be
> .\"O interpreted as part of its name.
> \fIparameter\fP の値が置換されます。ブレースが必要になるのは、
> .I parameter
> が 2 桁以上の数字を持つ位置パラメータの場合や、
> .I parameter
> の直後の文字を名前の一部として解釈させたくない場合です。

「parameter の値が置換されます」は「parameter の値に」でしょう。
${parameter:-word}では、同じ文 "the value of parameter is substituted."
を「parameter の値に置換されます」と訳しています。

「parameter の値に置換します」と能動態でもよいと思います。そうすると、
ほかの部分まで書き換えなければなりませんが。

> .\"O If the first character of \fIparameter\fP is an exclamation point (\fB!\fP)
> ,
> .\"O a level of variable indirection is introduced.
> .\"O \fBBash\fP uses the value of the variable formed from the rest of
> .\"O \fIparameter\fP as the name of the variable; this variable is then
> .\"O expanded and that value is used in the rest of the substitution, rather
> .\"O than the value of \fIparameter\fP itself.
> .\"O This is known as \fIindirect expansion\fP.
> .\"O The exceptions to this are the expansions of ${\fB!\fP\fIprefix\fP\fB*\fP} 
> and
> .\"O ${\fB!\fP\fIname\fP[\fI@\fP]} described below.
> .\"O The exclamation point must immediately follow the left brace in order to
> .\"O introduce indirection.
> \fIparameter\fP の最初の文字が感嘆符である場合、間接変数レベル
> (level of variable indirection) という概念が導入されます。
> \fBbash\fP は、展開に \fIparameter\fP  そのものの値を使用するのでなく、
> \fIparameter\fP の感嘆符を除いた残りの文字を変数名として扱い、
> その変数の値をその後の展開に使用します。
> これが\fI間接展開 (indirect expansion)\fP と呼ばれるものです。
> ただし ${!\fIprefix\fP*} や ${\fB!\fP\fIname\fP[\fI@\fP]} の展開は例外です。
> これは以下で説明します。
> 間接展開を表すには、感嘆符は左ブレースの直後に続ける必要があります。

具体的には、こういうことでしょう。

  $ AAA=BBB; BBB=zzz; echo ${!AAA}
  zzz

"a level of variable indirection" は「間接変数レベル」と訳して
ありますが、"indirection" は普通「間接参照」とか「間接指定」と
訳すのではないでしょうか。"variable indirection" で「変数 (の)
間接参照」です。"a level of" は、どう訳せばよいか難しいのですが、
意味的には「一段 (階) の、一重の、一階層の、ワンレベルの、
ワンクッションの、間接レベル 1 の」ということでしょう。
きちんと説明するのは、わたしの力に余りますから、試訳で代えることに
します。大体こんな意味でしょう。一応「間接参照」を使っておきますが、
「間接指定」の方がよいかもしれません。

  もし parameter の最初の文字が感嘆符 (!) ならば、それはここで
  (一段階の) 変数間接参照を行うということです。bash は parameter 中の
  感嘆符を除いた文字からなる変数の値を変数名として使用し、その変数を
  さらに展開した値を以後の置換に使用します。parameter の値そのものは
  使わないわけです。これはいわゆる間接展開というものです。この動作には
  例外があり、後述する ${!prefix*} や ${!name[@]} の展開がそれに
  当たります。間接参照を使用するためには、感嘆符は左ブレースの直後に
  来なければなりません。

もうちょっと文を細かく区切るなら、「まず」を補って、

  ... bash は、まず parameter 中の感嘆符を除いた文字からなる変数の値を
  変数名として使用します。続いて、その変数を展開し、得られた値を以後の
  置換に使うのです。parameter の値そのものは使用しません。...

文がセミコロンで切れているので、文法的には "rather than" 以下は、
"this variable is then expanded ..." にしかかかりませんが、意味的には、
"Bash uses the value of the variable ..." 以下の全体にかかると考える
こともできます。そう考えれば、元の訳と同じように、"rather than" 以下を
前に持ってくることができます。その方がよいかもしれません。

  もし parameter の最初の文字が感嘆符 (!) ならば、一段の変数間接参照が
  行われます。その場合、parameter の値そのものは使用されません。
  bash は、まず parameter 中の感嘆符を除いた文字からなる変数の値を
  変数名として使用します。続いて、その変数を展開し、得られた値を以後の
  置換に使うのです。...

> .\"O When not performing substring expansion, using the forms documented below,
> .\"O \fBbash\fP tests for a parameter that is unset or null.  Omitting the colon
> .\"O results in a test only for a parameter that is unset.
> 部分文字列展開以外の場合、
> \fBbash\fP はパラメータが設定されているか、空ではないかを調べます。
> コロンを省略した場合には設定されているかどうかのみを調べます。

using the forms documented below の訳が抜けています。

> ${\fIparameter\fP\fB:\fP\fIoffset\fP\fB:\fP\fIlength\fP}
>     ---- (中略) ----
> .\"O If \fIlength\fP evaluates to a number less than zero, and \fIparameter\fP
> .\"O is not \fB@\fP and not an indexed or associative array, it is interpreted
> .\"O as an offset from the end of the value of \fIparameter\fP rather than
> .\"O a number of characters, and the expansion is the characters between the
> .\"O two offsets.

> \fIlength\fP を評価すると 0 未満の数になる場合、
> \fIparameter\fP が \fB@\fP ではなく、配列や連想配列ではなければ、
> この値は文字数ではなく \fIparameter\fP の値の末尾からのオフセットとして使われ、
> 展開結果は 2 つのオフセットの間の部分文字列となります。

細かいことですが、「parameter が @ ではなく、配列や連想配列ではなければ」
は、「配列や連想配列でもなければ」の方が自然です。

> ${\fB!\fP\fIprefix\fP\fB*\fP}
> .PD 0
> .TP
> ${\fB!\fP\fIprefix\fP\fB@\fP}
> .PD
> .\"O \fBNames matching prefix\fP.

> \fB前方一致する名前\fP.

「前方一致する変数名」のほうがよさそうです。

ここから「パラメータ展開」の最後まで、${parameter/pattern/string} を
除いて、最初の文の最後が「前方一致する名前.」というように、ピリオドに
なっています。普通に句点でよいのではないでしょうか。各項目の最初の文を
一種の見出し、あるいは要約と考えて、ほかの文と区別しようとなさった
のでしょうが、最初の文はボールドになっていますから、すでに十分に
区別されていると思います。

> ${\fB!\fP\fIname\fP[\fI@\fP]}
> .PD 0
> .TP
> ${\fB!\fP\fIname\fP[\fI*\fP]}
> .PD
> .\"O \fBList of array keys\fP.
> .\"O If \fIname\fP is an array variable, expands to the list of array indices
> .\"O (keys) assigned in \fIname\fP.
> \fB配列のキーのリスト\fP.
> \fIname\fP が配列変数であれば、\fIname\fP に代入されている配列の
> インデックス (キー) のリストに展開されます。

「name に代入されている」がどこまでかかるのか曖昧です。「name に
代入されている配列」とも読め、そう取ると、「配列 name に代入されて
いる配列」ということになって混乱します。また、この assign は、
「代入」でも通りますが、むしろ「割り当てる」という日常的な言葉に
訳した方がよいかもしれません。ユーザがインデックスの代入を意識的に
やるとはかぎりませんし。たとえば、「配列 name に割り当てられている
インデックス (キー) のリストに展開されます」などとするわけです。
ただ、そう訳すと、「... 配列変数であれば、配列 name に ...」と
「配列」が続くのが、美しくないので、「代入されている」を「割り当て
られている」に替えるだけにするという行き方もあると思います。

    ---- (ちょっと挿入) ----

唐突ですが、ずっと上の方の「シェル変数」中の  HOSTFILE について
気がついたことがあるので書いておきます。

> .B HOSTFILE

> .\"O .B HOSTFILE
> .\"O is set, but has no value, or does not name a readable file,
> .\"O \fBbash\fP attempts to read
> .\"O .FN /etc/hosts
> .\"O to obtain the list of possible hostname completions.

> .B HOSTFILE
> が設定されているがその値が空文字列の場合、
> \fBbash\fP は補完可能なホスト名のリストを取得するために
> .FN /etc/hosts
> を使用します。

or does not name a readable file の訳が抜けています。

    ---- (挿入終わり) ----

> ${\fIparameter\fP\fB#\fP\fIword\fP}
> .PD 0
> .TP
> ${\fIparameter\fP\fB##\fP\fIword\fP}
> .PD
> .\"O \fBRemove matching prefix pattern\fP.
> .\"O The 
> .\"O .I word
> .\"O is expanded to produce a pattern just as in pathname
> .\"O expansion.  If the pattern matches the beginning of

> \fBパターンに前方一致した部分を取り除く\fP.
> .I word
> が展開され、パス名展開の場合と同じようなパターンを作ります。

「同じようなパターン作る」と「同じようにパターンを作る」では、微妙ですが
意味が違います。ここは「同じように」の方。言い換えれば、「パス名展開と
まったく同じやり方で」。${parameter%%word}、${parameter/pattern/string}、
${parameter/pattern/string}、${parameter^pattern} も同様です。

> ${\fIparameter\fP\fB,\fP\fIpattern\fP}
> .TP
> ${\fIparameter\fP\fB,,\fP\fIpattern\fP}
> .PD
> .\"O \fBCase modification\fP.
>.\"O This expansion modifies the case of alphabetic characters in \fIparameter\fP.
> .\"O The \fIpattern\fP is expanded to produce a pattern just as in
> .\"O pathname expansion.
> .\"O The \fB^\fP operator converts lowercase letters matching \fIpattern\fP
> .\"O to uppercase; the \fB,\fP operator converts matching uppercase letters
> .\"O to lowercase.
> .\"O The \fB^^\fP and \fB,,\fP expansions convert each matched character in the
> .\"O expanded value; the \fB^\fP and \fB,\fP expansions match and convert only
> .\"O the first character in the expanded value.
> .\"O If \fIpattern\fP is omitted, it is treated like a \fB?\fP, which matches
> .\"O every character.
> \fB大文字小文字の変換\fP.
> \fIparameter\fP に含まれるアルファベットの大文字小文字を変換します。
> \fIpattern\fP が展開され、
> パス名展開の場合と同じようなパターンを作ります。
> \fB^\fP 演算子は \fIpattern\fP にマッチした小文字を大文字に変換します。
> \fB,\fP 演算子は \fIpattern\fP にマッチした大文字を小文字に変換します。
> \fB^^\fP 演算子と \fB,,\fP 演算子は、マッチした中の全ての文字を変換します。
> \fB^\fP 演算子と \fB,\fP 演算子の場合は、マッチした中の最初の文字だけ変換します。
> \fIpattern\fP を省略した場合、\fB?\fP を指定したものとして扱われ、
> 全ての文字にマッチします。

  ^^ 演算子と ,, 演算子は、マッチした中の全ての文字を変換します。
  ^ 演算子と , 演算子の場合は、マッチした中の最初の文字だけ変換します。

この二行の意味がわかりません。一行目については、原文は "The ^^ and
,, expansions convert each matched character in the expanded value"
ですから、逐語的に訳すなら、「^^ と ,, による展開は、(parameter を)
展開した値の中にあるマッチした文字を一つ一つ変換します」になり、
高橋さんのように訳すのなら、「マッチした中の」の「中の」が要らない
のだろうと思います。冗長ですが、わかりやすくするなら、「parameter を
展開した値の中のマッチした全ての文字」と parameter を補えばよいでしょう。

二行目について言うと、match and convert only the first character in
the expanded value" ですから (この match が訳では抜けています)、
「parameter を展開した値の最初の文字に対してのみ、マッチングと変換を
行います」であり、要するに頭文字の大文字 (小文字) 変換です。何だか
もの足りない動作ですが、英語では便利なのでしょう。

ちょっと実験をしてみます。

  $ AAA=abcdefab
  $ echo ${AAA^a}
  Abcdefab
  $ echo ${AAA^b}
  abcdefab    # b は大文字にならない。
  $ echo ${AAA^[ab]}
  Abcdefab
  $ echo ${AAA^[ba]}
  Abcdefab    # 大文字になったのは、先頭にある a の方。
  $ echo ${AAA^?}
  Abcdefab
  $ echo ${AAA^^[ba]}
  ABcdefAB

ご参考までに、試訳を付けておきます。

  ^^ や ,, の展開では、parameter を展開した値の中のマッチした全ての
  文字が変換されます。これに対して、^ や , の展開でマッチや変換の対象に
  なるのは、parameter を展開した値の最初の文字だけです。

> .\"O If
> .\"O .I parameter
> .\"O is
> .\"O .B @
> .\"O or
> .\"O .BR * ,
> .\"O the case modification operation is applied to each positional
> .\"O parameter in turn, and the expansion is the resultant list.
> .I parameter
>> .B @
> または
> .BR *
> の場合は、位置パラメータのそれぞれに大文字小文字の変換が適用され、
> 結果はリストに展開されます。
> .\"O If
> .\"O .I parameter
> .\"O is an array variable subscripted with
> .\"O .B @
> .\"O or
> .\"O .BR * ,
> .\"O the case modification operation is applied to each member of the
> .\"O array in turn, and the expansion is the resultant list.
> .I parameter
> が添字に
> .B @
> または
> .BR *
> の付いた配列変数の場合は、配列の要素のそれぞれに大文字小文字の変換が適用され、
> 結果はリストに展開されます。

"in turn" の訳が抜けていますが、「それぞれ」と言っているので、"in turn"
の意味は出ているかもしれません。ただ、このあたりは、${parameter#word}、
${parameter%word}、${parameter/pattern/string} と原文がほぼ同文なので、
訳文も揃えた方がよいかもしれません。そのへんは好みの問題ですけれど。

is applied の訳は「行われる」ぐらいでもよさそうな気がします。

> .SS コマンド置換
> .PP
> .\"O \fICommand substitution\fP allows the output of a command to replace
> .\"O the command name.  There are two forms:
> \fIコマンド置換 (command substitution)\fP を用いると、
> コマンド名をコマンドの出力で置き換えできます。
> コマンド置換には以下の 2 つの形式があります:

重箱の隅つつきですが、「置き換えできます」は「置き換えられます」か
「置き換えることができます」の方が自然だと思います。

ここも、文末がコロンです。

> .\"O .B Bash
> .\"O performs the expansion by executing \fIcommand\fP and
> .\"O replacing the command substitution with the standard output of the
> .\"O command, with any trailing newlines deleted.

> .B bash
> による展開は、\fIcommand\fP の実行およびコマンド置換の部分を
> コマンドの標準出力と置換することにより実行されます。

こういうことは言い出すとキリがないのですが、「コマンド置換の部分を
... 置換する」や「実行 ... により実行されます」は、ぎごちない気が
します。「コマンド置換の部分を ... で置き換える」などと言えば、
文がなだらかになります。「command の実行および」も、「command を
実行して」ではないでしょうか。まとめると、

  bash による展開は、command を実行し、コマンド置換の部分を
  コマンドの標準出力で置き換えることによって行われます。

> .\"O The first backquote not preceded by a backslash terminates the
> .\"O command substitution.

> バックスラッシュが前置されていないバッククォートがあると、
> そこでコマンド置換は閉じられます。

「閉じられます」で意味的には正しのですが、「終了します」と素直に
訳した方が、わかりやすいと思います。

> .SS 算術式展開

> .\"O All tokens in the expression undergo parameter expansion, string
> .\"O expansion, command substitution, and quote removal.

> 式に含まれる全てのトークンに対して、
> パラメータ展開・文字列展開・コマンド置換・クォートの削除が行われます。

原文の問題ですが、string expansion というのは、何なんでしょう。

> .SS プロセス置換
> .PP
> .\"O \fIProcess substitution\fP is supported on systems that support named
> .\"O pipes (\fIFIFOs\fP) or the \fB/dev/fd\fP method of naming open files.

> \fIプロセス置換 (process substitution)\fP がサポートされるのは、
> 名前付きパイプ (\fIFIFO\fP) または名前付きオープンファイルの
> \fB/dev/fd\fP メソッドをサポートしているシステムです。

「名前付きオープンファイル」って、何なんでしょう。

naming open file は現在分詞 + 名詞ではなく、動名詞でしょう。
method of の of は同格か、目的格の of。ですから、全体では、大体
「オープン状態のファイルに名前を付けるために /dev/fd を使用する方法」
といった意味だと思います。試みに訳してみると、

  プロセス置換 (process substitution) が使用できるのは、システムが
  名前付きパイプ (FIFO) をサポートしている場合や、/dev/fd を使って
  オープンファイルに名前を割り当てる方法ををサポートしている場合です。

あるいは、

  ... /dev/fd を使ってオープンファイルを指定する方法をサポートしている
  場合です。

訳してはみましたが、何を言っているのか、自分でもわかっていません。
実際の動作を踏まえて、工夫してみてください。

> .SS 単語の分割
> .PP
> .\"O The shell scans the results of
> .\"O parameter expansion,
> .\"O command substitution,
> .\"O and
> .\"O arithmetic expansion
> .\"O that did not occur within double quotes for
> .\"O .IR "word splitting" .
> シェルはパラメータ展開・コマンド置換・算術式展開
> (ダブルクォートの内部ではこれらの展開は行われません)
> の結果をスキャンし、
> .I "単語分割"
> を行います。

「(ダブルクォートの内部ではこれらの展開は行われません)」では、話が
逆です。実際には、ダブルクォートの内側でも、パラメータ展開などは
行われるのですから。

ここは、did not occur と過去形ですから、parameter expansion などが
行われたのは、シェルが結果をスキャンするより時間的に前だ、と言って
いるわけです。たとえば、こんな訳になります。

  パラメータ展開、コマンド置換、算術式展開が行われたのが、ダブル
  クォートの内側ではない場合、シェルはそうした展開の結果をスキャンして、
  単語分割を実行します。

# 「内側ではない場合」「内側ではなかった場合」、どちらが自然でしょうか。

この文は、たとえば「コマンド置換」の最後の文、「置換がダブルクォート内部
にある場合には、 置換の結果に対する単語分割とパス名展開は行われません」
に対応しています。

# わたしは、中黒 (・) より読点 (、)の方がきれいだと思うのですが、
# まあ、趣味の問題です。

> .\"O .B IFS
> .\"O is unset, or its
> .\"O value is exactly
> .\"O .BR <space><tab><newline> ,
> .\"O the default, then
> .\"O sequences of
> .\"O .BR <tab> ,
> .\"O and
> .\"O .B <newline>
> .\"O at the beginning and end of the results of the previous
> .\"O expansions are ignored, and
> .\"O any sequence of
> .\"O .B IFS
> .\"O characters not at the beginning or end serves to delimit words.

> .B IFS
> が設定されていないか、その値が正確にデフォルト値の
> .BR <スペース><タブ><改行>
> ならば、ほかの展開の結果の先頭や末尾の
> .BR <space> ,
> .BR <tab> ,
> .B <newline>
> の並びは無視され、
> 先頭と末尾以外の
> .SM
> .B IFS
> 文字の任意の列で単語が区切られます。 

「正確に」という訳は直訳すぎるのではないでしょうか。「その値が
デフォルトの <スペース><タブ><改行> とまったく同じならば」などと
するところだと思います。

二番目の <space>, <tab>, <newline> は英語のままです。

「ほかの展開」の原文は previous です。もっとも、元訳をなさった方は
あえて「ほかの」と訳したのかもしれません。

sequence を「列」と訳すのも、しっくりしません。「〜の並び」
「連続する〜」「〜の連続」「〜の続き」「一つ以上の〜」などの方が
よいのではないでしょうか。

「ほかの展開の結果の ...」以下が、何だか論理的にすっきりしません。
"sequences of ...at the beginning and end" と "sequence of ... not
at the beginning or end" という、原文では主語として対立的に使われている
言葉が、翻訳では「並びは無視され」「任意の列で」と格が違っているために、
はっきり対立していないせいではないかと思います。あるいは、「単語が
区切られる」が曖昧なのかもしれません。「先行する展開の結果が単語に
区切られる」こととも、「単語が何かに区切られる」こととも取れますから。
微妙な話なので、試しに訳してみます。

  IFS が設定されていないか、その値がデフォルトの <空白><タブ><改行> と
  まったく同じならば、先行する展開の結果の先頭と末尾にある <空白>、
  <タブ>、<改行> の連続は無視されますが、先頭と末尾以外にある 1 個以上の
  IFS 文字はすべて単語の区切りとして使用されます。

原文では前後の文は並列ですが、対照をはっきり出すために、and をあえて
「が」と訳しました。

> .\"O If
> .\"O .SM
> .\"O .B IFS
> .\"O has a value other than the default, then sequences of
> .\"O the whitespace characters
> .\"O .B space
> .\"O and
> .\"O .B tab
> .\"O are ignored at the beginning and end of the
> .\"O word, as long as the whitespace character is in the
> .\"O value of
> .\"O .SM
> .\"O .BR IFS
> .\"O (an
> .\"O .SM
> .\"O .B IFS
> .\"O whitespace character).
> .SM
> .B IFS
> がデフォルト以外の値を持っていれば、空白文字
> . RB ( スペース
> および
> .BR タブ )
> の列は単語の先頭と末尾では無視されます。これは空白文字が
> .SM
> .BR IFS
> の値 (
> .SM
> .B IFS
> 空白文字) に含まれる限り成り立ちます。

ここは、原文が 

   If IFS is unset, or its value is exactly <space><tab><newline> ...
   If IFS has a value other than the default ...

と対照になっているわけです。また、ここは "as long as ..."  以下を
別の文にすると、意味がわかりにくくなります。

"as long as the whitespace character" と the が付いて、しかも単数です。
この the はおそらく前方参照で、直前の "sequences of the whitespace
characters space and tab ... at the beginning and end of the word" の
"whitespace characters" の一つを指しているのだと、思います。
こんなところでしょうか。

  IFS がデフォルト以外の値を持っている場合、スペースやタブという
  空白文字の連続が単語の先頭や末尾で無視されるのは、その空白文字が
  IFS の値に含まれているとき (すなわち、IFS 空白文字の一つであるとき)
  だけです。

文章の流れを見るために、まとめてみます。

  シェルは 特殊変数 IFS に含まれる各文字を区切り文字として使用し、
  ほかの展開の結果をこれらの文字によって単語に分割します。IFS が
  設定されていないか、その値がデフォルトの <空白><タブ><改行> と
  まったく同じ場合は、先行する展開の結果の先頭と末尾にある <空白>、
  <タブ>、<改行> の連続は無視されますが、先頭と末尾以外にある 1 個以上の
  IFS 文字は、単語の区切りとして使用されます。IFS がデフォルト以外の
  値を持っている場合、スペースやタブという空白文字の連続が、単語の
  先頭や末尾で無視されるのは、その空白文字が IFS の値に含まれているとき
  (すなわち、IFS 空白文字の一つであるとき) だけです。IFS に含まれる、
  IFS 空白文字以外のいかなる文字も、隣接する任意の IFS 空白文字と一緒に
  なってフィールドの区切りとなります。もちろん、1 個以上の IFS 空白文字も
  単語の区切りとして扱われます。IFS の値が空文字列であれば、単語分割は
  全く行われません。

厳密に言うと、"Any character in IFS that is not IFS whitespace" は
単数で、"any adjacent IFS whitespace characters" は複数です。
つまり、空白文字以外の IFS 文字は一個が一つのデリミタとなり、
IFS 空白文字は複数個連続しても (空白以外の IFS 文字と一緒に使われる
場合も、空白文字だけが使われる場合も) 一つのデリミタとして働くという
ことなんでしょう (違うかな)。その辺の微妙さは、翻訳では出せませんでした。

> .\"O Unquoted implicit null arguments, resulting from the expansion of
> .\"O parameters that have no values, are removed.

> クォートされていない暗黙的な空の引き数が、
> 値を持たないパラメータを展開した結果として得られますが、
> これらは削除されます。

implicit は、何かもっとぴったりした訳語がないかと考えたのですが、
思いつきませんでした。

> .\"O If a parameter with no value is expanded within double quotes, a
> .\"O null argument results and is retained.

> 値を持たないパラメータがダブルクォート内部で展開されると、
> これは空である引き数となり、消されずに残ります。

「これは」は要らないのではないでしょうか。

-- 
長南洋一




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