[JM:03921] GNU_which の manpage のレビュー

Back to archive index
長南洋一 cyoic****@maple*****
2023年 2月 15日 (水) 22:25:21 JST


長南です。

"[POST:RO] GNU which which.1" につなぐべきかもしれませんが、一年近く
前のことなので、新しいスレッドにしました。投稿・公開から時間が経ちすぎて
いる上に、とんでもなく長いメールになってしまって、恐縮です。

この翻訳は、matsuand さんの原稿に ribbon さんが手を入れものなのですね。

この翻訳には、微妙な問題はたくさんありますが、重大な問題箇所は、3 件しかありま
せんでした。その内 1 件は 5 箇所あり、同一の問題です。翻訳上の問題は、その 1 件
5 箇所だけで、あとの 2 件は、翻訳と言うより、むしろ原文の問題でした。

◎ 重大なもの

○ "an alias (or shell function) for which (itself)" の "for" の解釈

  この for which は、全部で 5 箇所出てきます。
  
1. --read-alias, -i
    Read aliases from stdin, reporting matching ones on stdout. This is
    useful in combination with using an alias for which itself. For ex‐
    ample

    [訳文]
    標準入力からエイリアスを読み込んで、合致したものを標準出力します。
    これは which そのものを含む alias において、本オプションを合わせて
    利用すると便利です。 たとえば以下です。

  まず、小さなことですが、ついでに指摘しておきます。なぜ、訳文に
  「エイリアス」と「alias」が混じっているのでしょうか。それから、
  何に合致したものなんでしょう。また、「合致」というのは、語感が
  ちょっと強すぎませんか。「標準出力します」というのも、日本語として
  ちょっと不自然な気がします。

  さて、本題です。

  「これは which そのものを含む alias において、本オプションを合わせて
  利用すると便利です」というのは、何を言っているのかわかりません。
  「これは」の「これ」は、"This (option)" でしょうから、「これは (この
  オプションは) ... 本オプションを合わせて」というのは、文章が混乱して
  います。「これは、... エイリアスの使用と併せて使うと、便利です」でなければ、
  筋の通った文章にならないでしょう。また、「これは」を前文、すなわち
  「この動作は」ととっても、微妙に変だと思います。
  
  "an alias for which itself" という英語を「which そのものを含む alias」
  と訳すのも無理があります。元々の翻訳者は、"using an alias for which itself"
  の "for" がよくわからず、実際の動作を考えて適当に作文してしまったのでは
  ないでしょうか。

  この for は「〜に代わる、〜に代えて」という意味です。小学館ランダムハウス
  英和大辞典には

    13 (代用・代理) ... の代わりに, ... に代わって (in place of, instead of);
       ... を代表して, を象徴して (representing):

  という説明があり、

    a substitute for butter		バターの代用品
    write a letter for a person 	手紙を代筆する
    He is a Member for Silverbridge	シルバーブリッジ選出の議員だ

  などという文例が出ています。ですから、この部分は、次のような感じだと思います。
  なお、「which コマンド」と言っておけば、「そのもの (itself)」は訳さないでも
  よさそうです。

    [試訳 1]
    標準入力からエイリアスを読み込んで、引数に一致するものを標準出力に書き
    出します。このオプションは、which コマンドの代わりに使うエイリアスで
    使用するとよいでしょう。たとえば、次のようにです。
    alias which='alias | which -i'

  あるいは、
    [試訳 2]
    標準入力からエイリアスを読み込んで、引数に一致するものを標準出力に
    書き出します。このオプションは、which コマンドの代わりにエイリアスを
    使用する場合に、その中で使うとよいでしょう。たとえば、次のようにです。
    alias which=´alias | which -i´

  --read-functions の場合も考えると、どちらの訳し方がよいか、かなり迷います。

  "in combination with using an alias for which itself" の部分は、
  原文に忠実に訳すと、ごたごたして却って分かりにくくなりそうなので、単純化して
  訳しました。「あわせて」というのは、結局、「同時に、そのとき」、あるいは
  「その中で」ということでしょうから。

  useful を「よいでしょう」と訳したのも、ちょっとやり過ぎかもしれません。
  でも、この場合は、「有用である」ぐらいの意味でしょうから、「使うとよい」と
  言えるのではないかと思います。

  いずれにせよ、もっと適切な訳があるかもしれません。

  上で説明した for which は、他にも 4 箇所で出てきます。
  
  --read-function は --read-alias と、--skip-function は --skip-alias と
  ほとんど同じなので、--skip-alias と EXAMPLE についてだけ書いておきます 
  (--read-alias は、すでに挙げました)。

2. --skip-alias
    Ignore option `--read-alias´, if any. This is useful to explicity
    search for normal binaries, while using the `--read-alias´ option
    in an alias or function for which.

    [訳文]
    `--read-alias´ が指定されても無視します。 which に対するエイリアス
    や関数の中で `--read-alias´ オプションを利用している場合であって
    も、 明示的に通常の実行ファイルを検索する場合に利用できます。

  この場合、for を「対する」と訳すのは、間違いとは言えません。しかし、「対する」
  は多義的なので、「which の代わりに使うエイリアス」の意味だと、読者に理解して
  もらえないかもしれません。

    [試訳]
    `--read-alias´ オプションが指定されていても、それを無視します。
    このオプションは、which コマンドの代わりに使うエイリアスや関数で 
    `--read-alias´ オプションを使用している場合に、明示的に通常の
    バイナリを探すのに役に立ちます。

3. EXAMPLE
    The recommended way to use this utility is by adding an alias (C shell)
    or shell function (Bourne shell) for which like the following:

    [訳文]
    例
       このユーティリティーのお薦めの使い方は、 which に対するエイリアス (C
       シェル) やシェル関数 (Bourne シェル) を追加して利用する方法です。 たと
       えば以下です。

  ここでも、"for which" の訳が「which に対する」になっています。それに、
  「which に対するエイリアスやシェル関数を追加して利用する方法」というのは、
  何に追加するんでしょう。イマイチ意味が取りにくいと思います。

    [試訳 1]
    用例
       このユーティリティの使用に当たっては、以下のように、which コマンドの
       代わりに使用するエイリアスか (C shell の場合)、シェル関数を (Bourn
       shell の場合) 追加登録しておくことをおすすめします。 

  何に追加するかをもっとはっきりさせるなら、こうなります。

    [試訳 2]
       このユーティリティの使用に当たっては、以下のように、エイリアスか 
       (C shell の場合) シェル関数に (Bourn shell の場合)、which
       コマンドの代わりに使用するものを追加しておくことをおすすめします。 

  なお、EXAMPLE を「例」と一字に訳すのは、セクションの見出しとして落ち着きが
  悪いと思います。「用例」とか「実例」とか、二字にした方がよいのではありま
  せんか。

○ 重大だが、"alias for which" とは別の問題 (むしろ、原文の問題です)

1. EXAMPLE の最後の部分 (関数、エイリアスの実例と実行例の間のパラグラフ)

    This will print the readable ~/ and ./ when starting  which  from  your
    prompt, while still printing the full path when used from a script:

    [訳文]
    こうすることで、プロンプトから実行した場合には、見やすいように ~/ や ./
    を出力します。 スクリプトから利用した場合には、そのままフルパスで出力
    します。

  still は、「やはり」とか「相変わらず」と訳すことが多い言葉ですが、ここでは
  「オプション --show-{dot,tilde} があってもその影響を受けずに、相変わらず
  デフォルトのまま、フルパスで」ということでしょう。「そのまま」では、
  ちょっとボケていると思います。「まま」を使うのなら、「フルパスのまま
  表示します」ではないでしょうか。
  
  でも、私がここで言いたいのは、そういうことよりも、原文がおかしいということ
  です。プロンプトから実行したときとスクリプトから実行したときで、表示が違う
  というのは、常識からして不自然な気がします。

  実際に試してみましたが、用例のエイリアスや関数の which を、プロンプト、
  スクリプト内、どちらで実行しても、出力の表示に変わりはありませんでした。
  表示が変わるのは、出力先が標準出力や標準エラーであったときと、それ以外の
  ときとでです。which のバージョンで動作に違いがある可能性も考えましたが、
  2.17 という古いバージョンでも動作は変わりませんでした。そこで私は、
  こんなふうに訳注を付けました。

    [試訳]
    このようにしておくと、which をプロンプトから実行したときには、パスを ~/
    や ./ という読みやすい形で表示しますが、スクリプトから使用した場合には、
    通常通りフルパスの表示になります。(あるいは、「--show-dot や --show-tilde
    があっても、フルパスの表示のままです」と still を展開して訳す手もあります。)

        > which q2
        ~/bin/q2
        > echo `which q2`
        /home/carlo/bin/q2

    [訳注]  実際には、こうした関数やエイリアスを端末のプロンプトから
           実行しようと、 スクリプトから実行しようと、表示に変わりは
           ありません。出力先が、標準出力や標準エラーか、それ以外かで
           違いが生じるようです (上記二番目の実行例では、標準入力に
           出力しています)。 念のため、ご自分でお試しください。

2. BUGS

    The  HOME  directory  is determined by looking for the HOME environment
    variable, which aborts when this variable doesn´t  exist.  Which  will
    consider  two  equivalent  directories to be different when one of them
    contains a path with a symbolic link.

    [訳文]
    HOME ディレクトリは、環境変数 HOME を調べることで決定されますが、この変
    数が存在しない場合には、その処理がキャンセルされます。which は 2 つの同
    等のディレクトリであっても、その 1 つにシンボリックリンクを使ったパスが
    含まれている場合に、別のディレクトリと取り扱ってしまいます。

  "which aborts" の which ですが、以下に述べるように (そして、実例でも
  示すように)、$HOME が設定されていなくても which コマンドそのものが
  途中終了するわけではないので、これは訳文の解釈のとおり、前文全体を受ける
  関係代名詞でしょうが、「その処理がキャンセルされる」というのは、具体的には
  どういうことなんでしょうか。
  
  実を言うと、これも原文に問題があります。which-2.18 までは、環境変数 HOME が
  設定されていない場合、HOME ディレクトリの特定はそれ以上行わず、次の処理に
  移っていたようです (つまり、HOME ディレクトリの特定処理を abort する。
  完了させない。中断する)。しかし、パッケージ同梱の NEWS ファイルに書いて
  ありますが、which-2.19 以後は、HOME が設定されていない場合、/etc/passwd
  ファイルが調べられ、そこでも指定されていない場合は、'/' がホームディレクトリに
  なるそうです。

  実際には、こんな風に動作します。

  # まず、環境変数 HOME を unset します
  $ unset HOME
  
  # which-2.17 の場合 (which のリポジトリになぜか 2.18 はありませんでした)
  $ which --show-tilde timer.sh ls
  which: --show-tilde: Environment variable HOME not set
  /home/hoge/bin/timer.sh
  /usr/bin/ls

  # which-2.21 の場合
  $ which --show-tilde timer.sh ls
  ~/bin/timer.sh
  /usr/bin/ls

  つまり、現在では、HOME が存在しない場合も、HOME の特定作業は続けられ、
  ホームディレクトリ内に実行ファイルがあれば、ディレクトリ部分にチルダが
  表示されるということです。そこで、私は、ここにも訳注を付けておきました。

    [試訳]
    HOME ディレクトリの特定は、環境変数 HOME を調べることで行われますが、
    変数 HOME が存在しない場合は、この特定作業は打ち切られます。また、which は、
    二つのディレクトリが同じものであっても、 片方のパスにシンボリックリンクが
    含まれている場合は、別のディレクトリと見なすことになります。

    [訳注]  前半の記述は古いようです。パッケージ同梱の NEWS ファイルによれば、
           which-2.19   以来、環境変数   HOME   が設定されていない場合は、
	   /etc/passwd  ファイルが調べられ、そこでも指定されていない場合は、
	   '/' がホームディレクトリになるとのことです。

◎  以下は、それほど重大ではないもの (つまり、誤訳・誤情報とまでは
   言えないものの微妙なところがあるものや、ケアレスミスです。最後の三つは、
   かなり重要かもしれません)

  これは、たくさんありますが、個人の好みの問題だと言われれば、そうかもしれ
  ません。ご参考までに、というところです。もっとも、私としては、もうちょっと
  丁寧に訳していただきたいと思いますけれど。

○ DESCRIPTION から

    Which takes one or more arguments. For each of its arguments it prints
    to stdout the full path of the executables that would have been exe‐
    cuted when this argument had been entered at the shell prompt. It does
    this by searching for an executable or script in the directories listed
    in the environment variable PATH using the same algorithm as bash(1).

    [訳文]
    which は 1 つまたは複数の引数を取ります。 その引数それぞれに対して、そ
    の引数がシェルプロンプトから入力された際に、実行されることになる実行モ
    ジュールのフルパスを stdout に出力します。 これを実現する際には、環境変
    数 PATH に列記されたディレクトリ内から実行ファイルやスクリプトを検索し
    ます。 これは bash(1) と同じアルゴリズムを用いています。

  「その引数がシェルプロンプトから入力された際に、実行されることになる」
  というのは、仮定法過去完了の訳として、ちょっとやり過ぎな気がします 
  (仮定法過去の訳なら、問題ないでしょう。と言うより、原文は仮定法過去で
  十分だったのではないかと思います)。しかし、実際の動作を考えると、
  間違えたことを言っているわけではないので、仮定法過去完了を仮定法過去として
  訳すという行き方もアリなのかもしれません。

  executables を「実行モジュール」と訳すのは、よくあることですか。
  そもそも executable、つまりシェルのコマンドというのは、モジュールなんで
  しょうか。他の部分では、executable の訳は「実行ファイル」になっています。

  stdout がどうして日本語になっていないんでしょう?

  [試訳]
    which は、ひとつ以上の引数を取り、そうした引数のそれぞれについて、それが
    シェルプロンプトから入力された場合に、実行されていたであろう実行ファイル
    のフルパスを標準出力に書き出します。which は、それを行うに当たり、
    bash(1) と同じアルゴリズムを使用して、環境変数 PATH にリストされた
    ディレクトリを調べ、実行ファイルやスクリプトを捜します。

  「実行されていたであろう」は、いかにも野暮ったいですが。

○ --all, -a
    Print all matching executables in PATH, not just the first.

    [訳文]
    PATH 内に見つかった実行ファイルすべてを表示します。 最初に見つかっ
    たもの以外も表示します。

  matching が「見つかった」になっていますが、他の部分では「合致した」です。
  「PATH 内に見つかった実行ファイルすべてを表示します」というのは、言葉どおり
  に解されたら、変なことになりませんか。また、こういう場合は、後ろから
  訳した方が日本語として自然だと思います。

   [試訳]
   PATH 中で最初に引数に一致したものだけでなく、一致したすべての実行
   ファイルを表示します。

○ --skip-alias
    Ignore option `--read-alias´, if any. This is useful to explicity
    search for normal binaries, while using the `--read-alias´ option
    in an alias or function for which.

    [訳文]
    `--read-alias´ が指定されても無視します。 which に対するエイリアス
    や関数の中で `--read-alias´ オプションを利用している場合であって
    も、 明示的に通常の実行ファイルを検索する場合に利用できます。

    useful と usable は違うでしょう。それに、ここでは、文脈から言っても、
    「利用できる、使用できる」と言いたいのではなく、「便利だ、役に立つ」と
    言っているのだと思います。

  私の試訳は、"for which (itself)" を論じた上の方に挙げておきました。

○ --skip-functions

  --skip-alias と同様、ここでも useful が「利用できます」になっています。

○ --skip-dot
    Skip directories in PATH that start with a dot.

    [訳文]
    PATH 内のディレクトリのうち、ドットで始まるディレクトリは除外します。

  これは、翻訳に問題はありません (skip を「除外する」と訳したのは、
  上手いと思います (ただし、「検索 (あるいは、探索) から除外します」
  と補足した方が、意味がより明確になりそうです)。しかし、原文が不十分、
  不正確です。「ドットで始まるディレクトリ」と言ったら、たとえば ".local" 
  なども当てはまることになるのではないでしょうか。入試問題などなら、
  設問が不正確なときは、どんな解答をしても、正解扱いでしょうが、翻訳では、
  -- それもマニュアルの翻訳では -- 原文の不備は、訳文で補うべきだと思います。
  そこで、試訳は、こんなふうになります。これでもまだ、分かりにくい気が
  するので、訳注も付けました。

    [試訳]
    PATH 中のドット (.) 1 個のディレクトリから始まるパスをスキップします。

    [訳注] 環境変数 PATH に ’.’ や (ありそうにないことですが) ’./bin’ などが
          登録されている場合のことを言っています。’$HOME/.local' といった
          ディレクトリのことではありません。そのへんの事情は、‘--show-dot’
	  でも同じです。

○ --show-tilde
    Output a tilde when a directory matches the HOME directory. This
    option is ignored when which is invoked as root.

    [訳文]
    ディレクトリが HOME に合致した場合、チルダを表示します。 このオプ
    ションは root ユーザーが実行した際には無視されます。

  "as root" と "by root"、「ルートとして実行した」と「root ユーザが実行した」
  は、同じではないと思います。

  "when a directory matches the HOME directory" というのは、
  あるディレクトリの一部が $HOME と一致する、ということでしょう。
  「合致する」というと、あるディレクトリと HOME ディレクトリが完全に一致する、
  という感じになりませんか (もっとも、$HOME 以下はすべてホームディレクトリだ、
  とも言えますが、それは小文字の the home directory ではないでしょうか)。
  こういうこともあるので、match の訳語として「合致」を使うのは、意味が
  強すぎるのではないかと思うわけです。

    [試訳]
    ディレクトリに HOME ディレクトリと一致する部分があるときは、
    チルダを出力します。 このオプションは、which が root の権限で実行
    されている場合には無視されます。

  訳がくどいと思われるならば、「合致」や「一致」を使わず、「マッチ」で
  すます手もあります。「ディレクトリが HOME ディレクトリとマッチする場合は」
  というふうに。ただしその場合は、match の出てくる他の場所の訳も考え直さな
  ければなりません。

○ --tty-only
    Stop processing options on the right if not on tty.

    [訳文]
    tty 上でない場合、この右側に指定されたオプションの実行を停止します。

  オプションは「実行」するものですか。実行するのはコマンドで、オプションは
  コマンドの動作を調節、変更するものなのではありませんか。

  tty は日本語に翻訳すべきでしょう。それに、ここでも原文が不十分です。何が
  tty 上ではないのでしょうか。which の実行でしょうか、出力でしょうか。
  実際に動かしてみたところ、これは、「出力が端末でない場合」ということでした
  (厳密に言うと、出力が標準出力や標準エラーでない場合)。また、このオプションが
  有効なのは、'--show-dot' と '--show-tilde' に対してだけでした。
  そこで、試訳では「出力」を補足し、訳注も付けました。ついでに言うと、
  オプションは複数です。「この右側に」も複数をほのめかしているのかも
  しれませんが、「これより右(側)にある」と言えば、複数であることを
  よりはっきりと暗示できるのではないでしょうか。

    [試訳]
    出力が端末でない場合は、これより右にあるオプションの処理を行いません。

    [訳注]  このオプションに効果があるのは、'--show-dot' と '--show-tilde'
           に対してだけのようです。

○ RETURN VALUE
    Which returns the number of failed arguments, or -1 when no `program‐
    name´ was given.

    [訳文]
    which は検索に失敗した引数の数を返します。 また `programname´ が指定さ
    れなかった場合は -1 を返します。

  「書式」セクションから離れすぎているので、programname が唐突な気がします。
  「引数に 'programname' が指定されなかった場合には、」と「引数に」を補った
  方がよいと思います。また、「また」はなくてもよさそうです (あってもよいけれど)。

○ セクション名の AUTHOR

  この man page の場合は、「著者」ではなく、「作者」です。
  kmod のような例外もありますが、AUTHOR セクションに書かれている名前は、
  プログラムの作者であるのが普通です。紛らわしい場合は、パッケージ同梱の
  AUTHORS やソースファイル (この場合なら、which.c) を調べるとよいと思います。

○ シングルクォートが ACUTE ACCENT になっていること

  LANG を ja_JP.UTF-8 にしている場合、シングルクォート (0x27) が
  ACUTE ACCENT (0xC2 0xB4) になっている部分があります (全部そうかも
  しれません)。大部分は、見かけがちょっと違うだけで、問題ありませんが、
  次の二ヶ所は、読者が copy & paste で利用しようとすると、失敗することに
  なります。シングルクォートに戻しておいたほうがよいでしょう。

    --read-alias, -i の用例。
    alias which=´alias | which -i´

    EXAMPLE の [t]csh の例
    alias which ´alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde´

  たぶん、po ファイルで、"B<alias which=\\'alias | which -i\\'>."
  などとなっているところを "B<alias which='alias | which -i'>."
  とすればよいのだと思います。"\'" は、groff で ACUTE ACCENT を
  表すらしいのです (LANG=C ならシングルクォートが表示されるのですが)。

○ 「注意書き」を付けるべきこと

  which には、GNU_which 以外の which もあります。たとえば debian は、
  もっと単純な which を使っています。ですから、この man page には、
  -- 特に Web で公開する html 版には -- 次のような「注意書き」を付けた方が
  よいと思います。

    読者への御注意
       これは、GNU 版の which コマンドのマニュアルです。which の実装には、
       いくつかの系統があります。そのため、お手元の which が別系統であるときは、
       オプションなどがここで説明しているものとかなり違うかもしれません。
       その場合は、お手元の 'which' に付属するマニュアルをご覧になってください。

ご参考までに、メールに私の翻訳を添付しておきます。which の info をチェック
したときに、ゼロから翻訳してみたのですが、それを roff に書き直したものです。
私は、情報の伝達を主眼とするマニュアル類には「だ、である」がふさわしいと思って
いますので、「だ、である」文体になっています。

もっとも、自分の考えを他人に押し付けるつもりは、毛頭ありません。「だ、である」
を原則とするとした、中野さんたち、第一世代のプロジェクト・メンバーのご意見は
一見識だと思っていますが、coreutils の manpage (info ではない方) は、
Free Translation Project 経由で (確か、そうでしたね) 「です、ます」ですし、
前からあるものでも bash などは「です、ます」ですから、両方の文体が交じるのは、
もうどうしようもないと思っています。新しく訳すものは翻訳者の自由、前から
あるものについては、原則として前例を踏襲する、ぐらいでやっていくよりない
のではないでしょうか。

私の訳は、メール本文に書き込んだものも含めて、あくまでも訳例、見本のつもりです。
もし、ご自分の翻訳を軸にして、私の案を取り込むのなら、翻訳者の一人として私の
名前を出す必要はありません。私の試訳を基にして翻訳をやり直す場合は、共訳なり
何なりにしていただきたいと思います。

ご参考までに私の訳の全文を添付します。訳注や注意書きがたくさんあるので、
po4a の addendum ではなく、patch にしました。添付ファイルの構成は、
以下のようになっています。

$ tar tzf which-2.21.tar.gz 
which-2.21/
which-2.21/which.1          (原文)
which-2.21/which-ja.1       (patch を当てたあとの日本語版)
which-2.21/which-ja.patch
which-2.21/which-ja.po

-- 
長南洋一
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: which-2.21.tar.gz
型:         application/octet-stream
サイズ:     7035 バイト
説明:       無し
URL:        <https://lists.osdn.me/mailman/archives/linuxjm-discuss/attachments/20230215/735f2200/attachment-0001.obj>


linuxjm-discuss メーリングリストの案内
Back to archive index