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

アーカイブの一覧に戻る

長南洋一 cyoic****@maple*****
2011年 10月 1日 (土) 11:38:09 JST


長南です。

わたしも前に言われたことですが、議論の対象の原文はできるだけ付けて
おいてください。メールが長くなるという難点はありますが、原文を捜す
手間が省けます。日本語訳の方はケースバイケースで。

> .\"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 は省略して、「値は算術式として
>> 評価され、変数の現在の値に加算されます」だけにしてしまうのが、一番
>> すっきりしているのではないかと思っています。
> 
> この訳文を反映しました。

後で気がついたのですが、原文は、+= を使った場合は評価が二度行われる
ということを、はっきり言っておきたかったのかもしれません。訳文でも
その意図を汲むのなら、たとえば、

  値は算術式として評価され、変数の現在の値に加えられて、もう一度
  (あるいは、さらに) 評価されます

でしょうか。まあ、読んでわかりやすい方を選べばよいと思います。

> .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 $@
> を展開しても空文字列になります (つまり取り除かれます)。

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

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

実験してみないと、意味がわからないのは、翻訳として残念なことです。
それで、もう一工夫していただけないかな、と思ったわけです。

「結び付き」という言葉が曖昧なのかもしれません。「結び付く」と
言っても、いろんな結び付き方があるでしょう。ここでは「一つの
単語になる」、つまり、間に空白を持たない結び付き方なわけで ...。

もっとも、原文の表現がわかりにくいのですから、訳文がわかりにくくても
仕方がないのかもしれません。

>> 「(つまり取り除かれます)」は、何が取り除かれるのか、よくわかりません。
> 
> "$*" のように空文字列になるのではなく、その要素が取り除かれる、というこ
> とですね。
> 
> $ 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 が付いていなければ、ご説明で納得できる
のですが。

話は変わりますが、上の実例を見ているうちに、気がついたことが
あります。高橋さんとわたしでは、そもそも startup の解釈が違う
のですね。わたしは startup を bash が対話的シェルとして起動されること
と取りました。高橋さんは、シェルスクリプトを直接実行するときや、
bash をシェルスクリプトを引き数にして実行するときも、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 変数の説明もご覧になってください。

-- 
長南洋一




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