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

Zurück zum Archiv-Index

長南洋一 cyoic****@maple*****
2011年 11月 29日 (火) 21:16:28 JST


長南です。

Takahashi さんのメールより [JM:00517]
>
> ●“substitution”(“substitute”)と“expand”と“use”の 3 つの言葉は
>  どう使い分けられているのか
>
> →この直前で、${parameter} を「parameter の値に置換されます」と説明して
>  います。考えている部分はこの説明の直後なので、“substitute”は同じこと
>  を指すと考えるのが(動作と照らし合わせても)自然だと考えます。
>  →長南さんの例でいうと、BBB から zzz に展開することを指すと考えます
> 
> →“expand”は、とりあえず一般的な「展開」と考えておきます。この場合は、
>  結果的に変数の値を求めることになります

おっしゃりたいことが、やっとわかったような気がします。
変数間接参照では、当然ながら、展開を行い、最終的に得られた値で
parameter を置換することになる。"in the rest of the substitution" の
"the substitution" は、その展開から置換までの全体を指している、という
ことですね。たしかに、そう解釈するのが正しいかもしれません。少なくとも、
ひとつの立派な解釈だと思います。

その考えで行くと、"the rest" というのは、substitution における
最後の置換動作を指すことになります。問題部分は、こんなふうに
解釈できます。

  ... (続いて、さらに) この変数 (BBB) が展開され、最終的な置換では
  その値 (zzz) が使用されることになります。parameter そのものの値は
  (最終的な置換では) 使用されません。

# 「最終的な置換」は、とりあえず使ってみたものです。

> ●parameter は、長南さんの例でいうと“AAA”ではなく“!AAA”を指すもの

これは、同意してくださるわけですね。

> →「parameter そのものの値を使用しません」では辻褄があわない
>
> →“rather than〜”を“Bash uses〜”以降全体にかかると考えると辻褄があ
>  わない。原文どおり“this variable is then〜”以降にかかると考えたほう
>  がいい

厳密に言うと、"rather than the value of parameter" は "that value
is used in the rest of the substitution" の "that value" にかかる
ということですね。ここを直訳すると (上と重なりますが)、こんなふうに
なります。

  次にこの変数が展開され、parameter そのものの値ではなく、その値が
  最終的な置換で使用されます。

問題は、「この変数が展開され」と「その値が」の間が開きすぎること
なんです。そのため、「その値」の「その」が何を指しているかわかり
にくくなっている。それで、わたしは、最初の試訳では "rather than ..."
の訳を別の文にして、後ろに置きました。しかし、考えているうちに、
「bash はまず、parameter の感嘆符を除いた部分からなる変数を展開し」の
前に持ってきても、パラグラフ全体の意味はほとんど変わらず、むしろ
読みやすくなりそうだ、と気がついて、"rather than ..." の訳を前に
出すことにしたのです。そして、くどくなるのを避けるために、「最終的な
置換 (試訳では、以後の置換)」を省略しました。元訳をなさった方も、
この部分を前に持ってきていますから、同じようにお考えになったのだと
思います。

「最終的な置換」を省略しない方がよいということでしたら、元訳にならって、
「この場合、bash は parameter そのものの値を置換に使用しません」などと
すればよいと思います。原文の構成を変えたくないのなら、わたしの最初の
訳例のように、後ろに付ければよいでしょうし。

> で、今回、“「値そのもの」という言葉がよくわからない”という長南さんの
> 指摘により、「値そのものを使う」を「値を展開結果として使う」と変更します。

こんなふうになるのですか。

  parameter の最初の文字が感嘆符ならば、一段の変数間接参照が
  行われます。
  この場合、bash はまず、parameter の感嘆符を除いた部分を
  変数名とし、展開します。
  そして、値を展開結果して使うのではなく、続いて変数名の置換に使います。

失礼ながら、前とそう変わっていないのではないかと思います。
原文では "and that value is used" と zzz がきちんと出ています。
それに、"in the rest of the substitution" に使うのは、BBB ではなく
zzz です。"rather than the value of parameter itself" も抜けています。

# 込み入った原文に出会ったときに、わたしもよくやることですが、一度
# 原文にできるだけ忠実な直訳を作ってみるとよいと思います。
# そして、自分の訳と比べてみると、何を訳し落としているかわかることが
# あります。あくまで比較に使うのであって、直訳の方を採用しろと
# いうことではありません。

    -------------------------------------------------------
もう必要ないのではないかと思いますが、原文と、AAA、BBB、zzz の説明を
念のため付けておきます。

原文
  If  the  first  character  of  parameter is an exclamation point (!),
  a level of variable indirection is introduced.
  Bash uses the value of the variable formed from the rest of
  parameter as the name of the variable; this variable is then
  expanded and that value is used in the rest of the substitution,
  rather than the value of parameter itself.

変数間接参照の例
  $ AAA=BBB; BBB=zzz; echo ${!AAA}
  zzz

-- 
長南洋一




linuxjm-discuss メーリングリストの案内
Zurück zum Archiv-Index