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

アーカイブの一覧に戻る

長南洋一 cyoic****@maple*****
2011年 9月 16日 (金) 20:16:38 JST


長南です。

まず、わたしの質問にお答えくださったことについて。

Takahashi さんのメールより [JM:00396]
>
>>> .\"O When the shell is in \fIposix mode\fP, it does not recognize
>>> .\"O \fBtime\fP as a reserved word if the next token begins with a `-'.
>>> シェルが \fIposix モードのときには、
>>> 後に続くトークンが `-' であれば \fBtime\fP を予約語と認識しません。

>> ところで、この一節はどういう意味なんでしょうか。
> 
> たとえば、bash 4.2 で以下のコマンドを実行してみます。
> 
> time -p : 2> /dev/null
> 
> 通常の bash では time は予約語であってコマンドではないので、time の出力
> はリダイレクト対象にならず、端末に表示されます。いっぽう、bash --posix
> で起動したときには、上記の time はコマンドとして扱われるので、出力がリ
> ダイレクト対象となり、端末に表示されません。

bash には予約語の time とビルトイン・コマンドの time がある。
予約語の time は標準出力に出力する。ビルトイン・コマンドの time は
標準エラーに出力する。そういうことですか。これは、bash 4.2 の新しい
機能みたいですね。debian sid の bash は 4.1.5 なのですが、POSIX
モードであるかどうかにかかわらず (つまり、予約語であるか、ビルトイン・
コマンドであるかにかかわらず)、time が標準エラーに出力するようですから。

# ビルトイン・コマンドと予約語が別の物だとは知りませんでした。

>>> .\"O When the shell is in \fIposix mode\fP, \fBtime\fP
>>> .\"O may be followed by a newline.  In this case, the shell displays the
>>> .\"O total user and system time consumed by the shell and its children.
>>> シェルが \fIposix モードのときには、\fBtime\fP の直後が改行でもかまいません。
>>> この場合、シェルと子プロセスが消費したユーザ時間とシステム時間を出力します。

>> このパラグラフも、何を言っているのかわたしにはわかりません。
>> time[改行] と打ち込んだら、POSIX モードであろうとなかろうと、
>>
>>  real    0m0.000s
>>  user    0m0.000s
>>  sys     0m0.000s
>>
>> と出力されるだけではないのでしょうか。
> 
> bash 4.2 を bash --posix で起動して引き数なしの time を実行したところ、
> それまでに実行したコマンドの消費時間が表示されました。最近のバージョン
> の挙動かもしれません。

これも、bash 4.2 の新しい動作のようですね。sid の bash 4.1.5 では、
「それまでに実行したコマンドの消費時間」の合計は表示されません
でしたから。

以下は、もうちょっと議論したいところです。

>>> .B \-\-debugger
>>> .\"O Arrange for the debugger profile to be executed before the shell
>>> .\"O starts.
>>> シェルの実行を開始する前に、デバッグモードを準備します。
>>
>> 要約のしすぎのような気もします。もっとも、debugger profile の
>> 説明がこのマニュアルにはないようですから、こう訳すよりなかった
>> のかもしれませんが。
> 
> 直訳調でいくと「デバッガー設定」とでもなるでしょうか。
> ここについては、よい代案がなければ、今のままにしておきます。

わたしは .bash_profile のようなデバッガ用のドット・ファイルがあって
それを実行するのかと思っていました。高橋さんは、プログラム内に
デバッグモードにするための基本ルーティンみたいなものがあって、それを
実行すると、お考えになったのですね。それならば、原文を要約した訳では
ないので、そうではないという証拠が出てこないかぎり、現在の訳でよいと
思います。

>>> .\"O .B Bash
>>> .\"O attempts to determine when it is being run with its standard input
>>> .\"O connected to a network connection, as when executed by the remote shell
>>> .\"O daemon, usually \fIrshd\fP, or the secure shell daemon \fIsshd\fP.
>>> .B bash
>>> は、自分を起動したのがリモートシェルデーモン (通常はリモートシェルデーモン
>>> \fIrshd\fP またはセキュアシェルデーモン \fIsshd\fP) かどうかを調べます。
>>
>> 現行訳を引き継いでいますが、端折りすぎではないでしょうか。determine
>> when it is being run with its standard input connected to a network
>> connection と具体的なことを言っていますから、省略すべきではないと
>> 思います。
> 
> 「標準入力がネットワークに接続されて起動されたどうかにより、」を
> 追加しました。

こうなさったわけですね。

> .B bash
> は、標準入力がネットワークに接続されて起動されたかどうかにより、
> 自分を起動したのがリモートシェルデーモン (通常はリモートシェルデーモン
> \fIrshd\fP またはセキュアシェルデーモン \fIsshd\fP) かどうかを調べます。

これは、元木さんの [JM:00398] の解釈の方が正しいのではないかと
思います。すなわち、

> [JM:00398] から
> 
> rshd や sshd によって実行された場合など、標準入力がネットワーク接続に
> 接続された状態で実行されたかどうかを調べます。

when 以下は determin の目的語なのか、それとも determine は自動詞なのか、
判断が難しいところです。when が that や whether だったら、簡単なんですが。

determine を自動詞と取って、あるいは、when を that だか whether だかの
微妙なバリエーションと取って、直訳風に訳してみます。

  bash は、標準入力がネットワーク・コネクションに接続された状態で
  実行された場合、そのことを確認しようとします。たとえば、リモート
  シェル・デーモン (たいていは rshd) やセキュアシェル・デーモン sshd に
  よって実行された場合です。こうした形で実行されていると確認すると、
  bash は ~/.bashrc が存在して、読み込み可能であれば、コマンドを
  そのファイルから読み込んで、実行します。

要するに、bash を起動したのが rshd か sshd かは重要ではない、
rshd や sshd で起動された bash は、ログインシェル扱いしない、だから
~/.bashrc しか読まないというのが、この部分の核心なのではないでしょうか。
すこし、訳し方を変えてみます。

  bash は起動されたとき、標準入力がネットワーク・コネクションに
  接続されているかどうかを確かめようとします。リモートシェル・
  デーモン (普通は rshd) やセキュアシェル・デーモン sshd によって
  実行される場合がこれに当たります。bash は、こうした形で実行
  されていると判断すると ...

まあ、わたしの解釈は間違っているかもしれませんし、「標準入力が
ネットワーク・コネクションに接続されている」という言い方が
できるかどうかわかりませんけれど (ちょっとごまかしのような気も
します)。

# 元木さんへ。
# 前の訳の原文が見たかったのは、この部分なのです。教えていただいた
# URL をたどって、何とか見つけることができました。前の訳の原文も
# Bash attempts to determine when ... なんですね。
# ... when it is being run by the remote shell daemon, usually rshd.
# と続く。

>>> .\"O If any expression is omitted, it behaves as if it evaluates to 1.
>>> .\"O The return value is the exit status of the last command in \fIlist\fP
>>> .\"O that is executed, or false if any of the expressions is invalid.

>> 返却ステータスが「不正な値」というのは、どういうことなのでしょうか。
> 
> 「算術式のいずれかが不正である場合には偽となります」と変更しました。

失礼、「算術式が不正」というのも、変なような。算術式はおそらく間違えて
いるだけで、悪いことをしているわけではありませんから。今までどおり、
「無効」の方がよいのではないでしょうか。

>>> .\"O The standard output of
>>> .\"O .I command
>>> .\"O is connected via a pipe to a file descriptor in the executing shell,
>>> .\"O and that file descriptor is assigned to \fINAME\fP[0].

>>> .I command
>>> の標準出力は、実行しているシェルのファイル・ディスクリプターと
>>> パイプによって接続されます。
>>> このファイル・ディスクリプターは \fINAME\fP[0] に代入されます。
> (略)
>> シェルのファイルディスクリプタと言っても、いくつもあるでしょうから、
>> ちょっとくどくなりますが、「シェルのファイル・ディスクリプターの一つ」
>> と言うべきではないでしょうか。
> 
> 「の一つ」を追加しました。

前のメールには原文だけ書いて、翻訳部分を書き忘れましたが、
標準入力についても同じことが言えます。

> .\"O The standard input of
> .\"O .I command
> .\"O is connected via a pipe to a file descriptor in the executing shell,
> .\"O and that file descriptor is assigned to \fINAME\fP[1].

> .I command
> の標準入力は、実行しているシェルのファイル・ディスクリプターと
> パイプによって接続されます。
> このファイル・ディスクリプターは \fINAME\fP[1] に代入されます。

なお、わたしとしては、「command の標準出力は ... command の標準入力は
... 」と、ほぼ同じ文が繰り返されるのが気になります。「command の
標準入力もまた、実行しているシェルの ... 」としたいところですが、
単なる趣味の問題かもしれません。

>>> .\"O The exit status of a function definition is zero unless a syntax error
>>> .\"O occurs or a readonly function with the same name already exists.
>>> .\"O When executed, the exit status of a function is the exit status of the
>>> .\"O last command executed in the body.  (See
>>> .\"O .SM
>>> .\"O .B FUNCTIONS
>>> .\"O below.)
>>> 関数定義の終了ステータスは、文法エラーが置きた場合や、
>>> 読み込み専用の関数が同じ名前で定義れていた場合を除き、0 です。
>>>
>>> 関数を実行したときの終了ステータスは、実体の中で最後に実行されたコマンドの終了ス
>>> テータスになります (後述の
>>> .SM
>>> .B 関数
>>> を参照)

>> ここでも、一パラグラフの原文を二つに区切っていますが、どうせやるなら、
>> 「関数定義の終了ステータスは」の前にも空行を設けて、三つに区切ったら
>> どうでしょうか。あるいは、空行は「関数定義の終了ステータスは」の
>> 前だけにするという行き方もあると思います。
> 
> すみません、空行は単なるミスでしたので削りました。
> ほかの箇所でも意図していなかった空行を削りました。

いえ、原文のパラグラフを二つ (あるいは三つ) に分けることに、わたしは
賛成なのです。欧米人が長いパラグラフを平気で使うのに対して、日本人は
短いパラグラフを好むようです (夢枕獏の小説を見よ、です)。ですから、
ここで切りたいと思ったときは、切ってしまって構わないと思います。

この function の説明とにかく、{ list; } の説明の部分は、パラグラフを
二つに分けた方がよいのではないかと思います。これも趣味の問題ですけれど。

>>> .\"O .SH QUOTING
>>> .SH クォート
>>> .\"O \fIQuoting\fP is used to remove the special meaning of certain
>>> .\"O characters or words to the shell.  Quoting can be used to
>>
>>> \fIクォート (quoting)\fP を使うと、
>>> 特定の文字や単語のシェルに対する特別な意味を取り除けます。
>>
>> 「特別な意味を取り除けます」は、ちょっと日本語として苦しいのでは。
> 
> 「特別な意味をなくします」と変更しました。

「なくします」も微妙ですね。「をなくすことができます」「がなくなり
ます」「が失われます」「を解除できます」「を除去することができます」
「特定の文字や単語がシェルに対する特別な意味を持たなくなります」
などを思いつきますが、どれも帯に短しですし、「を無効にします」は
すぐ後で使っていますし。

それから、次の「クォートを用いると」以下は前の文の具体的な
説明ですから、「パラメータの展開を防いだりできるのです」と
止めた方がよいかもしれません。

-- 
長南洋一




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