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

アーカイブの一覧に戻る

長南洋一 cyoic****@maple*****
2011年 9月 27日 (火) 22:29:15 JST


長南です。

「パラメータ」セクションから、「シェル変数」の終わりまでチェック
しましたが、長くなりそうなので、まずは「特殊なパラメータ」の
終わりまでです。

# 「シェル変数」には気になるところがたくさんあって、迷っています。
# わたしが細かすぎるのかもしれませんし (いくらか自覚があります)。

最初に用語についてちょっと質問します。
・ 配列について element と member という言い方が出てきます。同じものと
   考えてよいのですか。
・ 同じく配列について、index と subscript (添字) があります。
   index は、普通の配列の 変数[数字] の数字を指す。
   subscript は、index と同じ意味にも使われるし、
   連想配列の 変数[文字列] の文字列を指すのにも使われる。

次のような文章があって、混乱しているのです。
「位置パラメータ」の直前のパラグラフです。

  In the context where an assignment statement is assigning a value
  to a shell variable or array index,  the += operator can be used
  to append to or  add  to  the  variable's  previous  value. 

  代入文でシェル変数や配列のインデックスに値を代入する場面では、
  += 演算子を使って変数の直前の値に追加したり加算したりできます。 

ここでは、array index が配列の要素 (name[1] ...) を指している
みたいに読めるでしょう。

それでは始めます。上の引用と同じ部分ですが ...

> .\"O In the context where an assignment statement is assigning a value
> .\"O to a shell variable or array index, the += operator can be used to
> .\"O append to or add to the variable's previous value.
> .\"O When += is applied to a variable for which the \fIinteger\fP attribute has been
> .\"O set, \fIvalue\fP is evaluated as an arithmetic expression and added to the
> .\"O variable's current value, which is also evaluated.

> 代入文でシェル変数や配列のインデックスに値を代入する場面では、
> += 演算子を使って変数の直前の値に追加したり加算したりできます。
> += を変数\fI整数\fP属性が設定された変数に適用すると、
> \fI値\fPは算術式展開として評価され、
> 同じく評価された変数の現在の値に加算されます。

「+= を変数\fI整数\fP属性が設定された変数に適用すると」は、「変数」が
一個多いのでは? 「適用」もちょっと固いので、「使用」ぐらいでよいと
思います。

value is evaluated as an arithmetic expression は expansion では
ないので、「算術式」だけで十分では?

which is also evaluated を「同じく評価された」と過去形に訳して
いますが、as an arithmetic expression が省略されていると
解釈なさったのですか。それなら、「同じく算術式として評価された
(あるいは、評価される)」と省略部分を表に出した方がわかりやすい
のではないでしょうか。

わたしとしてはむしろ、ここは現在形ですし、いわゆる関係代名詞の
継続用法なので、前から読んで行った方が自然だと思います。
add to the variable's current value を「加算式を作る」ぐらいに
とって、こんなふうに訳します。

  += を整数属性が設定された変数に対して使用すると、値は算術式として
  評価され、変数の現在の値に加えられて、それがさらに評価されます。

さらに言うと、which is also evaluated は省略して、「値は算術式として
評価され、変数の現在の値に加算されます」だけにしてしまうのが、一番
すっきりしているのではないかと思っています。

わたしとしては、どれでも (現在のままの訳し方でも) よいと思います。
ただ、もう一度、(ほかの可能性も含めて) 考えていただきたかっただけです。

> .\"O When += is applied to an array variable using compound assignment (see
> .\"O .B Arrays
> .\"O below), the
> .\"O variable's value is not unset (as it is when using =), and new values are
> .\"O appended to the array beginning at one greater than the array's maximum index
> .\"O (for indexed arrays) or added as additional key\-value pairs in an
> .\"O associative array.
> .\"O When applied to a string-valued variable, \fIvalue\fP is expanded and
> .\"O appended to the variable's value.

>  += が配列変数への複合代入 (後述の
> .B 配列
> を参照) に適用すると、
> 変数の値が設定されていなければ (= の場合と同じく)、
> 新しい値は配列の最大のインデックスより一つ大きい位置から追加されるか
> (インデックスによる配列の場合)、新しいキーと値のペアが追加されます
> (連想配列の場合)。
> 文字列の値の変数に適用すると、\fI値\fPが展開され、
> 変数の値に追加されます。

「 += が配列変数への複合代入」ですが、余分な空白が「+」の前にあります。
「が」ではなく、「を」ではないでしょうか。

the variable's value is not unset の unset は「破棄、廃棄、解除、
取り消し」ではありませんか (わたしの記憶では、このマニュアルでは
「破棄」を多用しています)。訳例を挙げると、

  += を配列変数への複合代入 (後述の 配列 を参照) で使用すると、
  変数の現在の値は (= を使ったときとは違って) unset (破棄) され
  ません。インデックスによる配列の場合は、新しい値が最大の
  インデックスより一つ大きいインデックスから配列に追加されます。
  連想配列の場合は、新しいキーと値の組が追加されます。文字列の値を
  持つ変数に使用すると、値が展開されて、変数の元の値の後ろにそれが
  追加されます。

> .B @
> .\"O Expands to the positional parameters, starting from one.  When the
> .\"O expansion occurs within double quotes, each parameter expands to a
> .\"O separate word.  That is, "\fB$@\fP" is equivalent to
> .\"O "\fB$1\fP" "\fB$2\fP" ...
> .\"O If the double-quoted expansion occurs within a word, the expansion of
> .\"O the first parameter is joined with the beginning part of the original
> .\"O word, and the expansion of the last parameter is joined with the last
> .\"O part of the original word.
> .\"O When there are no positional parameters, "\fB$@\fP" and 
> .\"O .B $@
> .\"O expand to nothing (i.e., they are removed).
> (1 から始まる) 全ての位置パラメータに展開されます。
> ダブルクォートの内部で展開が行われたときは、
> それぞれのパラメータは別々の単語に展開されます。
> つまり "\fB$@\fP" は "\fB$1\fP" "\fB$2\fP" ... と同じです。
> 単語の中でダブルクォートの展開が行われるときには、
> 最初のパラメータの展開結果に元の単語のダブルクォートより前の部分が
> 結び付き、最後のパラメータの展開結果に元の単語のダブルクォートより
> 後の部分が結び付きます。
> 位置パラメータがない場合には、"\fB$@\fP" と
> .B $@
> を展開しても空文字列になります (つまり取り除かれます)。

「*」の説明でも同じことが言えますが、「ダブルクォートの内部で展開が
行われたときは」は「(このパラメータが) ダブルクォートで (前後を) 
囲まれているときは」と訳す手もあるかもしれません。

「単語の中でダブルクォートの展開が ...」以下は、意味がよくわかりません。

たとえば、hoge.sh の内容が、

  for i in start"$@"end    # "start$@end" と書いても結果は同じ。
  do 
      echo $i
  done

だったとき、./hoge.sh AAA BBB "CCC DDD" EEE の出力はこうなります

  $ hoge.sh AAA BBB CCC DDD EEE
  startAAA
  BBB
  CCC DDD
  EEEend

どう訳せばよいのでしょう。

  ダブルクォートの展開が一つの単語の内側で行われる場合は、
  一番目のパラメータの展開結果が元の単語の前半とひとつになり、
  最後のパラメータの展開結果が元の単語の後半とひとつになります。 

大して違わないか。実例と照らし合わせないと、これでもわかりにくいですね。

読者に読んだだけで了解してもらうには、「一番目のパラメータの
展開結果が元の単語の前半と結合して一つの単語になり、最後の
パラメータの展開結果が元の単語の後半と結合してこちらも一つの
単語になります」と補足する必要があるのでしょうか。でも、ゴタゴタして
かえってわかりにくくなるかもしれませんし。

# 「一つの単語」「一番目の」は、このマニュアルの書き方だと、
# 「1 つの単語」「1 番目の」かもしれません。

「"$@" と $@ を展開しても空文字列になります」は「"$@" や $@」だと
思います。

「(つまり取り除かれます)」は、何が取り除かれるのか、よくわかりません。

> .B 0
> .\"O Expands to the name of the shell or shell script.  This is set at
> .\"O shell initialization.  If
> .\"O .B bash
> .\"O is invoked with a file of commands,
> .\"O .B $0
> .\"O is set to the name of that file.  If
> .\"O .B bash
> .\"O is started with the
> .\"O .B \-c
> .\"O option, then
> .\"O .B $0
> .\"O is set to the first argument after the string to be
> .\"O executed, if one is present.  Otherwise, it is set
> .\"O to the file name used to invoke
> .\"O .BR bash ,
> .\"O as given by argument zero.
> シェルまたはシェルスクリプトの名前に展開されます。
> これはシェルの初期化時に設定されます。
> コマンドを記述したファイルを指定して
> .B bash
> を起動した場合、
> .B $0
> にはそのファイルの名前が設定されます。
> .B \-c
> オプションを付けて
> .B bash
> を起動した場合、実行する文字列の後に引き数があれば、その最初の値が
> .B $0
> に設定されます。このオプションを指定していない場合には、
> .BR bash
> を起動するときに使用した名前が引き数 0 として与えられ 
> .B $0
> に設定されます。

Otherwise を「このオプションを指定していない場合には」と訳して
いますが、この Otherwise は「『-c  オプションを付けて bash を
起動した場合、実行する文字列の後に引き数が』なければ」という意味
ではないでしょうか。「オプション」セクションの -c の説明を読むと、
そんな気がします。

「bash を起動するときに使用した名前が」も「ファイル名が」と言った方が
よいのではないでしょうか。

as given by argument zero の訳は、実際の動作として原文と同じこと
なんでしょうか。同じならば、これで結構ですが。

> .B _
> .\"O At shell startup, set to the absolute pathname used to invoke the
> .\"O shell or shell script being executed as passed in the environment
> .\"O or argument list.
> .\"O Subsequently, expands to the last argument to the previous command,
> .\"O after expansion.
> .\"O Also set to the full pathname used to invoke each command executed
> .\"O and placed in the environment exported to that command.
> .\"O When checking mail, this parameter holds the name of the mail file
> .\"O currently being checked.
> シェルの起動時には、環境または引き数リストで渡された、
> 実行するシェルまたはシェルスクリプトの絶対ファイル名が設定されます。
> その後は、前のコマンドに対する最後の引き数 (展開後のもの) に展開されます。
> また、実行する各コマンドの完全なファイル名が設定され、
> そのコマンドの環境にエクスポートされます。
> メールをチェックするときには、
> このパラメータは現在チェックしているメールのファイル名を保持します。

absolute pathname は「絶対パス名」の方がよいのではないでしょうか。

もしかすると、being executed as passed in the environment or argument
list は、shell script だけにかかるのかもしれません。

Subsequently, expands to the last argument は、「その後では」や
「起動後には」「起動した後では」などと始めた方がよいかもしれません。
なお、 At shell startup, set to や Also set to の set は受動態ですが、
expands は能動態です。もっとも、「展開します」でも「展開されます」でも
結局はおなじことかもしれませんが。

the previous command は「直前のコマンド」の方がよさそうです。

Also set to the full pathname 以下は、ちょっと要約のしすぎのような
気もします。でも、動作の説明としては正しそうなので、これはこれで
よいのでしょう。それから、ここも、the full pathname が「完全な
ファイル名」です。

「メールのファイル名」と「メールファイルの名前」は違うのではないかと
思います。

-- 
長南洋一




linuxjm-discuss メーリングリストの案内
アーカイブの一覧に戻る