Masakazu Takahashi
emasa****@gmail*****
2011年 10月 1日 (土) 21:27:41 JST
2011/10/1 長南洋一 <cyoic****@maple*****>: > 長南です。 > > わたしも前に言われたことですが、議論の対象の原文はできるだけ付けて > おいてください。メールが長くなるという難点はありますが、原文を捜す > 手間が省けます。日本語訳の方はケースバイケースで。 わかりました。 >> .\"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. > >>> さらに言うと、which is also evaluated は省略して、「値は算術式として >>> 評価され、変数の現在の値に加算されます」だけにしてしまうのが、一番 >>> すっきりしているのではないかと思っています。 >> >> この訳文を反映しました。 > > 後で気がついたのですが、原文は、+= を使った場合は評価が二度行われる > ということを、はっきり言っておきたかったのかもしれません。訳文でも > その意図を汲むのなら、たとえば、 > > 値は算術式として評価され、変数の現在の値に加えられて、もう一度 > (あるいは、さらに) 評価されます > > でしょうか。まあ、読んでわかりやすい方を選べばよいと思います。 元文の「which is also evaluated」は、左辺を評価(変数の値を取得)し、右 辺を評価(式を演算)し、両者を足して左辺の変数に代入することを指してい ると考えます。そのため、ここでは前回の修正内容のままにしておきます。 >> .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 $@ >> を展開しても空文字列になります (つまり取り除かれます)。 > >>> 「単語の中でダブルクォートの展開が ...」以下は、意味がよくわかりません。 > >>> 読者に読んだだけで了解してもらうには、「一番目のパラメータの >>> 展開結果が元の単語の前半と結合して一つの単語になり、最後の >>> パラメータの展開結果が元の単語の後半と結合してこちらも一つの >>> 単語になります」と補足する必要があるのでしょうか。でも、ゴタゴタして >>> かえってわかりにくくなるかもしれませんし。 >> >> と考えると元のままでいいかなと思います。 > > 実験してみないと、意味がわからないのは、翻訳として残念なことです。 > それで、もう一工夫していただけないかな、と思ったわけです。 > > 「結び付き」という言葉が曖昧なのかもしれません。「結び付く」と > 言っても、いろんな結び付き方があるでしょう。ここでは「一つの > 単語になる」、つまり、間に空白を持たない結び付き方なわけで ...。 > > もっとも、原文の表現がわかりにくいのですから、訳文がわかりにくくても > 仕方がないのかもしれません。 長南さんの懸念するポイントが「結び付き」という表現であると考え、以下の ように語順と単語を変えて変更しておきます。 単語の中でダブルクォートの展開が行われるときには、 元の単語のダブルクォートより前の部分の後に 最初のパラメータの展開結果がつながり、 最後のパラメータの展開結果の後に 元の単語のダブルクォートより後の部分がつながります。 https://github.com/emasaka/bash-jman/commit/86b651a5e890abd8f2f6f219480a6a9507d73b3b >>> 「(つまり取り除かれます)」は、何が取り除かれるのか、よくわかりません。 >> >> "$*" のように空文字列になるのではなく、その要素が取り除かれる、というこ >> とですね。 >> >> $ countargs() { echo $#; } >> $ foo() { countargs aa bb "$@"; } >> $ bar() { countargs aa bb "$*"; } >> $ foo >> 2 >> $ bar >> 3 >> >> ただ、そうするとその前の「空文字列になります」が間違いですので、 >> こちらを「無かったことになります」に変更しました。 > > そういうことだったんですか。これは実験してみないとわかりませんね。 > > わたしの案を書いておきます。よかったら、手を入れて、使ってください。 > > 位置パラメータが一つもない場合は、"$@" や $@ を展開しても、 > 何も起きません (すなわち、"$@" や $@ は取り除かれます)。 提案ありがとうございます。ただ、「何も起きません」は、この引数を受け取 るコマンドの動作を連想させること、"$@" 等が文字列に展開されることを 「何かが起きる」というのは違和感があることから、ちょっと見送らせてくだ さい。 >> .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. > >>>> シェルの起動時には、環境または引き数リストで渡された、 >>>> 実行するシェルまたはシェルスクリプトの絶対ファイル名が設定されます。 >>>> その後は、前のコマンドに対する最後の引き数 (展開後のもの) に展開されます。 >>>> また、実行する各コマンドの完全なファイル名が設定され、 >>>> そのコマンドの環境にエクスポートされます。 >>>> メールをチェックするときには、 >>>> このパラメータは現在チェックしているメールのファイル名を保持します。 > >>> もしかすると、being executed as passed in the environment or argument >>> list は、shell script だけにかかるのかもしれません。 >> >> 動作としては、bash 自体かシェルスクリプトかに関わらず、単に $0 の値が >> _ に設定されます。bash コマンドの引き数にシェルスクリプトを指定して起動 >> しても、$_ はシェルスクリプトのファイル名にはなりません。 >> >> $ cat /tmp/p >> #!/bin/bash >> echo $_ >> $ /tmp/p >> /tmp/p >> $ bash /tmp/p >> /bin/bash > > それでは、「環境または引き数リストで渡された ... シェルスクリプトの > 絶対ファイル名が設定されます」というのは、どういうことなんでしょう。 > > ここが、「シェルの起動時には、実行するシェルまたはシェルスクリプトの > 絶対ファイル名が設定されます」だけで、being executed as passed in the > environment or argument list が付いていなければ、ご説明で納得できる > のですが。 そうですね、“being executed as passed in the environment or argument list”が具体的に何を指すか謎ですね。 どなたか見当は付きますか? >皆様 ひとまず TODO 的な意味で GitHub の Issue にしておきます。 https://github.com/emasaka/bash-jman/issues/1 > 話は変わりますが、上の実例を見ているうちに、気がついたことが > あります。高橋さんとわたしでは、そもそも startup の解釈が違う > のですね。わたしは startup を bash が対話的シェルとして起動されること > と取りました。高橋さんは、シェルスクリプトを直接実行するときや、 > bash をシェルスクリプトを引き数にして実行するときも、bash の > startup だと考えていらっしゃる。どっちなんでしょう。 “startup”は文字どおり bash が startup するという意味だけで受け取って います。対話シェルに限られる場合にはそう明記してあるか、文脈から判断す るようになっていると考えています。 >> .\"O When checking mail, this parameter holds the name of the mail file >> .\"O currently being checked. > >> メールをチェックするときには、 >> このパラメータは現在チェックしているメールのファイル名を保持します。 > >>> 「メールのファイル名」と「メールファイルの名前」は違うのではないかと >>> 思います。 >> >> その前の部分から続いて「現在チェックしているメールのファイル名」となっ >> ているので、これでよいと思います。 > > the name of the mail file というのは、/var/mail/user とか、~/mbox の > ことではないかと思うのです (MH や Maildir 形式のディレクトリのことも > あるかもしれませんが)。そういうのを「メールのファイル名」とは言いにくい > でしょう。 あくまで議論として私の印象を明らかにしておくと、私は上記の場合について 「メールのファイル名」で違和感ありません。 > MAIL や MAILPATH 変数の説明もご覧になってください。 たとえば MAILPATH の説明では「メールのチェックに使うファイル名」「現在 のメールファイルの名前」と、両方が使われていますね。 -- Masakazu Takahashi (emasaka)