Masakazu Takahashi
emasa****@gmail*****
2011年 10月 23日 (日) 22:16:09 JST
2011/10/22 長南洋一 <cyoic****@maple*****>: > 長南です。 > > 「シェル変数」の終わりまでです。 レビューをありがとうございます。以下のとおり修正しました。 https://github.com/emasaka/bash-jman/commit/0a422822642de88a53f6355178c4af0213f40ad5 >> .\"O The following variables are used by the shell. In some cases, >> .\"O .B bash >> .\"O assigns a default value to a variable; these cases are noted >> .\"O below. >> 以下の変数はシェルが使用します。場合によっては、 >> .B bash >> がデフォルト値を変数に代入します。このような場合については後述します。 > > 「後述する」と言うと、後で特別な項目を立てて、説明するみたいですが、 > 実際にはそうした変数が出てくるたびに、そのつど言及しています > (HISTFILESIZE, HISTSIZE, IFS など)。ですから、「以下では、そのような > 場合はその旨注記します」とか「以下でも、そうした場合はその旨言及して > います」とかがよいと思います。 いただいた案を元に、「そのような場合についてはそれぞれ注記します」と変 更しました。 >> .B BASH_XTRACEFD >> .\"O If set to an integer corresponding to a valid file descriptor, \fBbash\fP >> .\"O will write the trace output generated when >> 有効なファイル・ディスクリプターに対応する整数をセットすると、 >> \fBbash\fP は >> .if t \f(CWset -x\fP >> .if n \fIset -x\fP >> .\"O is enabled to that file descriptor. >> .\"O The file descriptor is closed when >> .\"O .SM >> .\"O .B BASH_XTRACEFD >> .\"O is unset or assigned a new value. >> が設定されたときに、トレース出力をそのファイル・ディスクリプターに出力します。 > > will write the trace output generated の generated を省略なさって > いますが、訳出した方がよいのではないでしょうか。なくても意味は > 通じますけれど。 「生成された」を追加しました。 >> .\"O The file descriptor is closed when >> .\"O .SM >> .\"O .B BASH_XTRACEFD >> .\"O is unset or assigned a new value. > >> .B BASH_XTRACEFD >> が unset されるか、新しい値が代入されると、 >> ファイル・ディスクリプターはクローズされます。 > > すぐ後に「BASH_XTRACEFD を unset ... すると、トレース出力は標準エラー > 出力に送られます」と続きます。つまり、unset しても、今まで使っていた > ファイル・ディスクリプターが閉じられるだけなので、The を「現在の (前の)」 > ファイル・ディスクリプター」と訳した方がよいのではないでしょうか。 いただいた案を元に、「それまで設定されていた」を追加しました。 >> .\"O Note that setting >> .\"O .SM >> .\"O .B BASH_XTRACEFD >> .\"O to 2 (the standard error file >> .\"O descriptor) and then unsetting it will result in the standard error >> .\"O being closed. >> .SM >> .B BASH_XTRACEFD >> に 2 (標準エラー出力のファイル・ディスクリプター) を設定して >> unset すると、標準エラー出力がクローズされてしまうことに >> 注意してください。 > > 訳としては正しいのですが、著者の意図が今ひとつ出ていない気がします。 > つまり、ここでは標準エラーに出力させようとして、二重操作をやっては > いけない、と言いたいわけです。then を生かせばよいのではないでしょうか。 > たとえば、 > > BASH_XTRACEFD を 2 (標準エラー出力のファイル・ディスクリプター) に > 設定してから、さらに unset したりすると、標準エラー出力がクローズ > されてしまうことに気をつけてください。 「二重操作」という言葉で問題としている意味が、私には分かりませんでした。 「標準エラー出力であること」「BASH_XTRACEFD に 2(標準エラー出力)を設 定すること」「BASH_XTRACEFD を unset すること」は、それぞれ異なること かと思いますす。 この文にあるとおりに試してみます。 $ set -x # トレース出力をオンにする $ BASH_XTRACEFD=2 # トレース出力の先を 2 にする + BASH_XTRACEFD=2 # トレース出力 $ pwd # コマンドを実行 + pwd # トレース出力 /tmp $ unset BASH_XTRACEFD # BASH_XTRACEFD を unset する + unset BASH_XTRACEFD # トレース出力 # 標準エラー出力がクローズされたため、端末の # 入出力が不能になった >> .B GLOBIGNORE >> .\"O A colon-separated list of patterns defining the set of filenames to >> .\"O be ignored by pathname expansion. >> .\"O If a filename matched by a pathname expansion pattern also matches one >> .\"O of the patterns in >> .\"O .SM >> .\"O .BR GLOBIGNORE , >> .\"O it is removed from the list of matches. >> パス名展開で無視するファイル名の集合を定義するパターンを >> コロンで区切って並べたリストです。 >> パス名展開パターンにマッチするファイル名が >> .SM >> .BR GLOBIGNORE >> 内のパターンのどれかにもマッチする場合、 >> これはマッチしたもののリストから削除されます。 > > 前訳は「この、その」の使い分けが、ときどき不自然な気がします。 > この最後の行は、「それは」か「そのファイル名は」が自然ではないで > しょうか。あるいは、「これは」を削除しても、意味が通ると思います。 「これは」を削除しました。 >> .B HISTCONTROL > >> .\"O A value of >> .\"O .I ignoreboth >> .\"O is shorthand for \fIignorespace\fP and \fIignoredups\fP. >> .I ignoreboth >> は \fIignorespace\fP と \fIignoredups\fP の両方を指定します。 > > ちょっと表現が無理ぎみだと思います。たとえば、「ignoreboth を > 指定するのは、ignorespace と ignoredups の両方を指定するのと > 同じです」とか「ignoreboth は ignorespace と ignoredups の両方を > 意味します (意味する省略表現です)」とか。 いただいた訳を元に、「ignoreboth を指定すると ignorespace と Iignoredups の両方が指定されます」と変更しました。 >> .\"O A value of >> .\"O .IR erasedups >> .\"O causes all previous lines matching the current line to be removed from >> .\"O the history list before that line is saved. >> .\"O Any value not in the above list is ignored. >> .IR erasedups >> の値が設定されていると、行が保存される前に、 >> 現在の行に一致する過去の行が履歴リストから削除されます。 >> これらに該当しない値は無視されます。 > > 最後の訳文の「これら」の意味がよくわかりません。ignorespace, > ignoredups, ignoreboth, erasedups 以外の値は無視されるということ > でしょうか。それなら、「上記以外のいかなる値も無視されます」ぐらい > でしょうか。それでもわかりにくいなら、「この変数に上に挙げた以外の > 値を設定しても、無視されます」と、より説明的に訳すか。 いただいた訳を元に、「上記以外の値を設定しても無視されます」と 変更しました。 > >> .\"O If >> .\"O .SM >> .\"O .B HISTCONTROL >> .\"O is unset, or does not include a valid value, >> .\"O all lines read by the shell parser are saved on the history list, >> .\"O subject to the value of >> .\"O .SM >> .\"O .BR HISTIGNORE . >> .\"O The second and subsequent lines of a multi-line compound command are >> .\"O not tested, and are added to the history regardless of the value of >> .\"O .SM >> .\"O .BR HISTCONTROL . >> パーザが読み込んだ全ての行は >> .BR HISTIGNORE >> の値が示す条件の下で履歴リストに保存されます。 >> 複数行にまたがる複雑なコマンドの場合は >> 2 番目以降の行が調べられることはありません。よって、これらは >> .BR HISTCONTROL >> の値に関わらず履歴に追加されます。 > > 「if HISTCONTROL is unset, or does not include a valid value」 > の訳が抜けています。 「HISTCONTROL が設定されていない場合や、不正な値が設定されている場合に は、」を追加しました。 > by the shell parser の shell も抜けていますが、前の訳者の方が > 意図的に省略したのかもしれません。 「シェルの」を追加しました > compound command は「複合コマンド」と「シェルの文法」では訳していました。 > ここでは別の意味で使っているのでしょうか。 「複合コマンド」に変更しました。 > 感覚の問題ですから微妙ですが、「これら」も「それら」の方がよいと、 > わたしは思いますし、「そうした行は」の方がさらにわかりやすいと思います。 感覚の問題ですが、私は「これら」の方がよいと思いました。 >> .B HISTFILESIZE >> .\"O The maximum number of lines contained in the history file. When this >> .\"O variable is assigned a value, the history file is truncated, if >> .\"O necessary, by removing the oldest entries, >> .\"O to contain no more than that number of lines. The default >> .\"O value is 500. The history file is also truncated to this size after >> .\"O writing it when an interactive shell exits. >> 履歴ファイルに保持する履歴の最大数です。この変数に値が代入された場合、 >> その行数を越えないように、必要に応じて履歴ファイルが切り詰められます。 >> デフォルト値は 500 です。対話シェルが終了するときにも、 >> 履歴ファイルのサイズはファイル書き込みの後にこのサイズに切り詰められます。 > > by removing the oldest entries の訳が抜けています。 該当する 1 文を以下のように変更しました。 履歴ファイルに保持する履歴の最大数です。この変数に値が代入された場 合、その行数を越えないように、必要に応じて古いエントリを削除して履 歴ファイルを切り詰めます。 >> .B HISTIGNORE >> .\"O A colon-separated list of patterns used to decide which command lines >> .\"O should be saved on the history list. Each pattern is anchored at the >> .\"O beginning of the line and must match the complete line (no implicit >> .\"O `\fB*\fP' is appended). Each pattern is tested against the line >> .\"O after the checks specified by >> .\"O .SM >> .\"O .B HISTCONTROL >> .\"O are applied. >> どのコマンド行を履歴リストに保存するかを決めるために使うパターンを >> コロンで区切って並べたリストです。 >> それぞれのパターンは行の先頭と比較され、 >> 行全体が完全に一致しなければなりません >> (`\fB*\fP' が暗黙的に追加されるこ >> とはありません)。各パターンの評価は >> .B HISTCONTROL >> で指定したチェックが行われた後の行に対して実行されます。 > > Each pattern is anchored at は「行の先頭から比較され」「行頭から始まり」 > と言わないと、「行全体と完全に一致」とうまくつながらないと思います。 いただいた訳を参考に「行の先頭から比較され、行全体と完全に一致しなけれ ばなりません」と変更しました。 > 「各パターンの評価は HISTCONTROL で指定したチェックが行われた後の行に > 対して実行されます」は正しいのですが、ちょっともたついている気がします。 > 「各パターンの評価は ... チェックが行われた後で実行されます」と > 「行に対して」を取ってしまってもよいのではないでしょうか。あるいは、 > 「行に対する各パターンの評価は ... 後で実行されます」と「行に対する」 > の位置を変えてもよさそうです。 > >> .\"O The second and subsequent lines of a multi-line compound command are > >> 複数行にまたがる複雑なコマンドの場合、2 番目以降の行は調べられません。 > > 「複合コマンド」でしょうか。 「複合コマンド」に変更しました。 >> .B IGNOREEOF > >> .\"O exits. If the variable exists but does not have a numeric value, or >> .\"O has no value, the default value is 10. If it does not exist, > >> は終了しません。この変数に数値以外の値が設定されている場合や、 >> 値が設定されていない場合には、デフォルト値として 10 が使われます。 >> この変数が存在しなければ、 > > If the variable exists が省略されています。If the variable exists、 > If it does not exist と対照されていますから、省略してはまずいと > 思います。 ご指摘の点に加え、「変数が存在するが値が存在しない場合」を意訳し、 「値が設定されていない場合」を「空の値が設定されている場合」と変更しま した。 >> .B LANG >> .\"O Used to determine the locale category for any category not specifically >> .\"O selected with a variable starting with \fBLC_\fP. >> \fBLC_\fP で始まる変数で特に選択されない任意のカテゴリに対して、 >> ロケールのカテゴリを決めるために使います。 > > よくわからない訳ですが、これはものすごく訳しにくかったのだろう > と思います。 > > わたしはカテゴリという概念がさっぱりわからないので、うまく (いや、全然) > 説明できませんが、間違えている可能性は承知で、わたしの理解を書いて > おきます。そうしないと、話が始まらないので。 > > ロケールというものがある。要するにどの地域の言語と文化習慣 (お金の単位、 > 時刻表示の形式など) を使うかということで、たとえば、アメリカの英語と > 文化習慣とか、日本の日本語と文化習慣とか、そういうことである。 > また、ロケールには下位区分があって、locale category と呼ばれ、 > LC_COLLATE や LC_MESSAGES といった変数によって指定される > (ロケールカテゴリ、ロケールのカテゴリ、訳語としてはどちらがよい > でしょうか)。こちらも全体としてのロケールと同じように、言語と地域を > pt_BR (ブラジルのポルトガル語) といった形で指定する (待てよ、 > 全体としてのロケールの指定って、どうやるんでしょう。環境変数 LANG > でしょうか)。 > > # LC_COLLATE などを locale category と呼ぶという根拠は locale(1) の > # こんな文章です。 > # When invoked without arguments, locale summarizes the current locale > # environment for each locale category defined by the LC_* environment > # variables. > > ここで面倒なのは、ロケールを決めることを日本語でどう表現すればよいかと > いうことです。大カテゴリのロケールについては、「ロケールを何々に > 指定する、決める」と言えばよいので、問題がありません。しかし、 > サブカテゴリ (ロケールのカテゴリ) については (特に一般的に表現する > 場合に)、面倒なことになります。「ロケールのカテゴリのロケールを > 指定する」と言うことができるのでしょうか。できないとしたら、どう言えば > よいのでしょう。 > > grep(1) では「The locale for category LC_foo is specified by examining > the three environment variables LC_ALL, LC_foo, LANG, in that order.」 > と言っています。ですから、「カテゴリのロケールを指定する」と言えそう > なのですが ... > > 読みやすさを考えて、もう一度原文と翻訳を引用します。 > >> .B LANG >> .\"O Used to determine the locale category for any category not specifically >> .\"O selected with a variable starting with \fBLC_\fP. >> \fBLC_\fP で始まる変数で特に選択されない任意のカテゴリに対して、 >> ロケールのカテゴリを決めるために使います。 > > any category not specifically selected with ... の category は > locale category です。determine the locale category は、 > 「ロケールカテゴリのロケールを決める」ということでしょうから、 > こんな訳になるでしょうか。 > > LC_ に始まる変数によってロケールが明示的に選択されていない、 > いかなるロケールカテゴリに対しても、そのロケールを決定するために > 使用されます。 > > あるいは、 > > ロケールカテゴリが LC_ で始まる変数によって明示的に指定されて > いない場合、そうしたカテゴリのロケールを決定するのに使用されます。 > > これで読者にわかるでしょうか。わかればよいのだけれど ... > それとも、「ロケールカテゴリのロケールを決める」という表現は、 > やっぱり変でしょうか。 > > 「ロケールカテゴリのロケール」を避けるために、「値」という言葉を > 使うことができるかもしれません。上の試訳の「ロケール」を「値」に > 置き換えればよいのですが、もう一つ別の訳し方を挙げておきます。 > > LC_ で始まる変数によって明示的に指定されていないロケールカテゴリが > あれば、そのカテゴリの値を決定するのに (この変数の値が) 使用されます。 > > 「この変数の値が」は、どの試訳でも、あった方が親切かもしれません。 > わたしにできるのはこのくらいです。何か適切な訳をお考えになって > ください。 2 番目の訳を反映しました。 > # ところで、LANG は、ロケールカテゴリの一つなのでしょうか。 > >> .B LC_ALL >> .\"O This variable overrides the value of >> .\"O .SM >> .\"O .B LANG >> .\"O and any other >> .\"O \fBLC_\fP variable specifying a locale category. >> この変数はロケールのカテゴリを指定する \fBLC_\fP 変数と >> .B LANG >> の値を全て上書きします。 > > LC_ALL を設定しても、変数 LANG や LC_MESSAGES の値が上書きされる > わけではないので、override は「優先する、優越する」の方がよさそうです。 > > この変数の値は、LANG (の値) はもとより (あるいは、LANG の値を始め)、 > ロケールカテゴリを指定するほかのいかなる LC_ 変数の値よりも > 優先されます (優越します)。 いただいた案を元に「この変数はロケールのカテゴリを指定する LC_ 変数と LANG の値に優先します」と変更しました。 > しかし、なんで value と単数なんでしょう。 > > もう一つ、疑問。 > たとえば、export LC_MESSAGES=ja_JP.UTF-8 としたあと、export LC_ALL=C を > やると、echo $LC_MESSAGES は ja_JP.UTF-8 のままですが、locale コマンドの > 出力では、LC_MESSAGES の値が C になっています。そこまではよいのです。 > しかし、このときでも、locale の出力の LANG の値は ja_JP.UTF-8 のままです。 > この項の記述と矛盾しないでしょうか? 4.2 ではどうなっているのでしょう? > > # 「ロケールのカテゴリ」より「ロケールカテゴリ」の方が、曖昧さが > # ないので、よいと思います。LC_NUMERIC では「ロケールカテゴリ」を > # 使っていますし。 > > 今ちょっと思いついたのですが、「この変数は、LANG を始め、ほかの > いかなるLC_ 変数によって指定されたロケールカテゴリの値も上書き > します」なら、「上書き」が使えそうです。上書きされるのは、 > ロケールカテゴリの値であって、LC_ 変数の値ではないということで。 > でも、原文がそうなっていませんね。 > >> .B LC_COLLATE >> .\"O This variable determines the collation order used when sorting the >> .\"O results of pathname expansion, and determines the behavior of range >> .\"O expressions, equivalence classes, and collating sequences within >> .\"O pathname expansion and pattern matching. >> この変数はパス名展開の結果をソートするときに使用される照合順序と、 >> パス名展開とパターンマッチングにおける >> 範囲展開、同値クラス、照合シーケンスの動作決定します。 > > range expressions は「パターンマッチング」セクションでは「範囲表現」と > 訳しています。「範囲式」という訳も可能だと思いますが。 「範囲表現」に変更しました。 > collation order と collating sequences は同じことではないでしょうか。 両方者とも「照合順序」に揃えました。 > equivalence classes には、「同値類、同値クラス、等値クラス」という > 訳語がありますが、man ページも含めて、「等値クラス」と訳している例が > 多いようです。a, aウムラウト, aアクセント等を同じものとして扱う > ことのようですから、わたしとしては「同類クラス」と訳したいところ > ですが、すでに訳語ができ上がっているようなので、手遅れですね。 「等値クラス」に変更しました。 > この変数は、パス名展開の結果をソートするときに使用する文字の > 照合順序を決めます。また、パス名展開やパターンマッチングにおいて、 > 範囲表現や文字の等価クラス、照合順序の振る舞いを決定します。 > >> .B LC_CTYPE >> .\"O This variable determines the interpretation of characters and the >> .\"O behavior of character classes within pathname expansion and pattern >> .\"O matching. >> この変数は、パス名展開とパターンマッチングにおける >> 文字の解釈と文字クラスの挙動を決めます。 > > 「文字クラスの挙動」というのは、ちょっと変な気がするのですが ... > もっとも、わたくしも直前の試訳で behavior を「振る舞い」と訳して > いますけれど。 長南さんの「変な気がする」を尊重し、「文字クラスに含まれる文字」と意訳 しました。 >> .B MAIL >> .\"O If this parameter is set to a file or directory name and the >> .\"O .SM >> .\"O .B MAILPATH >> .\"O variable is not set, >> .\"O .B bash >> .\"O informs the user of the arrival of mail in the specified file or >> .\"O Maildir-format directory. >> このパラメータにファイル名が設定されており、かつ変数 >> .SM >> .B MAILPATH >> が設定されていなければ、 >> .B bash >> は指定されたファイルへのメールの到着をユーザに通知します。 > > 原文は a file or directory name と in the specified file or Maildir- > format directory。これは原文に変更があったのではないでしょうか。 前者は「またはディレクトリ名」を追加、後者は「またはMaildier形式のディ レクトリ」を追加しました。 >> .B MAILCHECK >> .\"O Specifies how >> .\"O often (in seconds) >> .\"O .B bash >> .\"O checks for mail. The default is 60 seconds. When it is time to check >> .\"O for mail, the shell does so before displaying the primary prompt. >> .\"O If this variable is unset, or set to a value that is not a number >> .\"O greater than or equal to zero, the shell disables mail checking. >> .B bash >> がメールをチェックする頻度を (秒数で) 指定します。 >> デフォルト値は 60 秒です。 >> メールをチェックする時間になると、 >> シェルはプライマリのプロンプトを表示する前にチェックを行います。 >> この変数が unset された場合、 >> あるいはこの変数に 0 より大きい数値以外が代入された場合は、 >> シェルはメールのチェックを行いません。 > > not a number greater than or equal to zero は「0 以上 (0 を含む) でない」 > すなわち、マイナスの数値でしょう。一方、「0 より大きい数値以外」は > 曖昧なところがあるけれど、0 及びマイナスの数値と取るのが自然です。 > 実際の動作はどっちなんでしょう。 メールのチェックが行われないのは、マイナスの値のときですね。 ソースコードのコメントには以下のように書かれていました。 | /* Negative number, or non-numbers (such as empty string) cause no | checking to take place. */ 「数値でない場合」のニュアンスを生かして、「0 以上の数値以外が代入され た場合は」と変更しました。 >> .B TMOUT >> .\"O If set to a value greater than zero, >> .\"O .SM >> .\"O .B TMOUT >> .\"O is treated as the >> .\"O default timeout for the \fBread\fP builtin. >> .\"O The \fBselect\fP command terminates if input does not arrive >> .\"O after >> .\"O .SM >> .\"O .B TMOUT >> .\"O seconds when input is coming from a terminal. >> .\"O In an interactive shell, the value is interpreted as the >> .\"O number of seconds to wait for input after issuing the primary prompt. >> .\"O .B Bash >> .\"O terminates after waiting for that number of seconds if input does >> .\"O not arrive. > >> \fBselect\fP コマンドは、端末からの入力の後に入力がないと >> .SM >> .B TMOUT >> 秒後に終了します。 > > 「端末からの入力の後に入力がないと」という状況がよくわかりません。 > > select コマンドは、端末から入力を受け付けているときに (あるいは、 > 端末からの入力中に)、TMOUT 秒待っても (あるいは、経っても) 入力が > ないと終了します。 > > ということでしょうか。 いただいた案を元に「Bselect コマンドは、端末からの入力の際に TMOUT 秒入 力がないと終了します」と変更しました。 >> .B auto_resume >> .\"O This variable controls how the shell interacts with the user and >> .\"O job control. If this variable is set, single word simple >> .\"O commands without redirections are treated as candidates for resumption >> .\"O of an existing stopped job. There is no ambiguity allowed; if there is >> .\"O more than one job beginning with the string typed, the job most recently >> .\"O accessed is selected. The >> .\"O .I name >> .\"O of a stopped job, in this context, is the command line used to >> .\"O start it. >> .\"O If set to the value >> .\"O .IR exact , >> .\"O the string supplied must match the name of a stopped job exactly; >> .\"O if set to >> .\"O .IR substring , >> .\"O the string supplied needs to match a substring of the name of a >> .\"O stopped job. The >> .\"O .I substring >> .\"O value provides functionality analogous to the >> .\"O .B %? >> .\"O job identifier (see >> .\"O .SM >> .\"O .B JOB CONTROL >> .\"O below). If set to any other value, the supplied string must >> .\"O be a prefix of a stopped job's name; this provides functionality >> .\"O analogous to the \fB%\fP\fIstring\fP job identifier. >> この変数はシェルがユーザとジョブ制御の相互作用をどのように扱うかを決めます。 >> この変数を設定した場合、1 語からなるリダイレクトなしの単純なコマンドが、 >> 停止中ジョブの実行再開候補として扱われます。 >> 曖昧な指定は許されません。 >> 入力された文字列で始まるジョブが複数ある場合には、 >> 最後にアクセスされたものが選ばれます。 >> ここでの >> .I 名前 >> とは、コマンドを起動する際に使ったコマンドラインのことです。 >> この値に >> .IR exact >> が設定されている場合、 >> 与えられた文字列は停止しているジョブの名前に >> 正確にマッチしなければなりません。 >> .IR substring >> が設定されている場合は、 >> 与えられた文字列は停止しているジョブの名前の部分文字列に >> マッチする必要があります。 >> .I substring >> という値は、ジョブ識別子の >> .B %? >> に似た機能を持っています (後述の >> .SM >> .B ジョブ制御 >> を参照)。 >> これ以外の値が設定されている場合、 >> 与えられた文字列は停止しているジョブの名前の >> プレフィックスでなければなりません。これはジョブ識別子の >> \fB%\fP\fIstring\fP と似た機能を持っています。 > > 読んだだけでは、言っていることがわからなかったので、実際に動かして > みました。たとえば、export auto_resume=1 と設定します (exact, > substring 以外の値の設定ですから、停止中のジョブを (複数あったら、 > 直近の方を)、コマンドの最初の数文字を打ち込むことで呼び出せるはず) 。 > そして、vi aaa.txt を実行し、何か書いてから、C-z で停止します。 > 続いて、同じ端末で vi bbb.txt、こちらも C-z で停止。 > プロンプトから v とだけ打ち込んで、リターン。これで vi bbb.txt を > フォアグラウンドに呼び出すことができました。 > > ところで、auto_resume をまったく設定しなかった場合は、どうなるのか。 > 上と同じように、[1] vi aaa.txt, [2] vi bbb.txt という停止したジョブを > 二つ作ります。そして、 > > $ v > bash: v: コマンドが見つかりません > $ %v > bash: fg: v: ambiguous job spec > > resume というのは、停止したジョブを再開させること。そして、auto > というのは、どのジョブを再開するかを bash が、ユーザが端末に打ち > 込んだ文字を元にして、自動的に選んでくれること。そういうことのようです。 > それとも、ジョブ制御に % を使わないでもすむことが auto なんでしょうか。 > > さて、検討に移ります。長いので、原文、訳文を少しづつ再引用します。 > >> .\"O This variable controls how the shell interacts with the user and >> .\"O job control. > >> この変数はシェルがユーザとジョブ制御の相互作用をどのように扱うかを決めます。 > > 訳文は「ユーザとジョブ制御が相互作用している」と言っていますが、 > 原文で interact しているのは、shell と the user and job control です。 > もっとも、user と job control が interact していると言えば、それは > そのとおりなので、こういう訳もあるのかもしれません。それに、上に > 述べたような実験をした後では、訳文が動作的に正しいことを言っているのも > わかります。でも、実験をした後でないと、何を言っているのかさっぱり > わかりません。もっとすっきりした明解な文にできないものでしょうか。 > > たとえば、shell が the user and job control というまとまりと > interact すると考えるのではなく、shell は the user 及び job control の > それぞれと interact すると解釈することもできると思います。 > user との interact とは、具体的にはジョブ制御に % を付けたり付けな > かったりすること。job control との interact は、auto_resume に > exact や substring を指定したときのジョブ制御の動作の変化です。 > そう考えると、訳文では「シェル」を省略して、 > > この変数は、ユーザがジョブ制御をするときの方法や、ジョブ制御そのものの > 動作を変更します。 > > とでも言っておけば、よいのではないでしょうか。これで原文の内容は > 伝わると思うのですが、乱暴でしょうか。まあ、後続する文とのつながりも > 考えなければなりませんから、難しいところですが。 いただいた訳を元に「この変数は、ユーザがジョブ制御をするときの方法を変 更します」と変更しました。 >> .\"O ... If this variable is set, single word simple >> .\"O commands without redirections are treated as candidates for resumption >> .\"O of an existing stopped job. > >> この変数を設定した場合、1 語からなるリダイレクトなしの単純なコマンドが、 >> 停止中ジョブの実行再開候補として扱われます。 > > 上に述べた実験では、vi aaa.txt などが実行再開候補になっていたと > 言えるのではないでしょうか。だとしたら、二語からなるコマンドが > 候補になっています。「1 語からなる ... 単純なコマンド」とは、 > どういうことなんでしょう。もし vi aaa.txt の vi が「1 語からなる > コマンド」で、だから候補になっていたのだとしたら、「1 語以上の > 語からなるコマンド」というのは、どういうものなんでしょうか。 > そもそも、そういうものが存在するのでしょうか。 > > それとも、ユーザが停止中のジョブを呼び出そうとして、コマンドラインから > 打ち込む文字について、「一語からなるコマンド (場合によっては、その一部)」 > だけを打ち込め、と言っているのでしょうか。ちょっと、試してみます。 > 上に述べた条件で (つまり、auto_resume=1、停止したジョブ [1] vi aaa.txt > と [2] vi bbb.txt がある)、vi aa と打ち込んでみます。すると、aaa.txt > ではなく、新しいファイルが開きました。どうやら、原文はこっちのことを > 言っているようです。としたら、訳文は (原文もですけれど) 説明不足です。 > > この変数を設定した場合、1 語からなるリダイレクトなしの単純なコマンドを > 打ち込むと、それが停止中のジョブの実行再開候補として扱われます。 > > ぐらいでしょうか。 > > # 実は、この記述は、auto_resume=substring には当てはまりませんし、 > # 厳密に言うと、auto_resume=1 にも当てはまりません (コマンドの > # 先頭部分だけでよいのですから)。 > > # さらに言うと、auto_resume=exact の場合は、説明として正しいことは > # 正しいけれど、ほとんど意味をなしません (と言うか、auto_resume=exact は > # ほとんど役に立たないのです)。なぜなら、auto_resume=exact の場合、vi と > # 打ち込んで呼び出せるのは、引数のない (停止した) vi というジョブだけ > # だからです。vi だけで vi aaa.txt というジョブは呼び出せませんし、 > # vi aaa.txt と打ち込むと、「スワップファイル ".aaa.txt.swp" が > # 既にある」というメッセージが出て、先に進めようとしても、停止した > # ジョブとは別の新しいジョブが実行されてしまいます。auto_resume=exact が > # ほとんど役に立たないということは、私だけの感想ではないようで、 > # 下記の記事にも書いてありました (この記事は、auto_resume について > # man ページよりもわかりやすい説明をしています)。 > # http://aplawrence.com/Unixart/auto_resume.html > > # つまり、原文がここで言っている、役に立つ (そして、重要な) 情報は、 > # auto_resume を設定しておくと、ジョブ制御をしたいとき、コマンド > # ラインの先頭に % を付ける必要がなくなるということだけなのです。 > # それなら、そうはっきり言えばよいのに、と思います。 最後の懸念点はよくわかりませんが、いただいた訳文を元に、以下のように 変更します。 この変数を設定した場合、1 語からなるリダイレクトなしの単純なコマン ドを入力すると、停止中のジョブの実行再開候補として扱われます。 >> .\"O accessed is selected. The >> .\"O .I name >> .\"O of a stopped job, in this context, is the command line used to >> .\"O start it. > >> ここでの >> .I 名前 >> とは、コマンドを起動する際に使ったコマンドラインのことです。 > > of a stopped job の訳が抜けています。省略しない方がよさそうです。 「ここでの名前」を「停止中のジョブの名前」に変更しました。 >> .\"O If set to the value >> .\"O .IR exact , >> .\"O the string supplied must match the name of a stopped job exactly; > >> この値に >> .IR exact >> が設定されている場合、 >> 与えられた文字列は停止しているジョブの名前に >> 正確にマッチしなければなりません。 > > 「この変数の値に」と言った方が誤解のおそれが少ないと思います。 「変数の」を追加しました。 >> .\"O below). If set to any other value, the supplied string must >> .\"O be a prefix of a stopped job's name; this provides functionality >> .\"O analogous to the \fB%\fP\fIstring\fP job identifier. > >> これ以外の値が設定されている場合、 >> 与えられた文字列は停止しているジョブの名前の >> プレフィックスでなければなりません。これはジョブ識別子の >> \fB%\fP\fIstring\fP と似た機能を持っています。 > > 「プレフィックス」と言うと、% や ! と紛らわしいので、「最初の数文字」 > ぐらいにしておいた方がよいと思います。ちなみに「ジョブ制御」では > 「先頭部分、先頭の部分」と訳しています。こちらでもよいですね。 「先頭部分」に変更しました。 >> .B histchars > >> .\"O The second character is the \fIquick substitution\fP >> .\"O character, which is used as shorthand for re-running the previous >> .\"O command entered, substituting one string for another in the command. >> .\"O The default is `\fB^\fP'. > >> 2 番目の文字は \fI簡易置換 (quick substitution)\fP >> 文字であり、前に入力したコマンドの文字列を >> 別の文字列に置き換えて再実行するための省略表現として使います。 >> デフォルト値は `\fB^\fP' です。 > > 簡易置換を試してみたのですが、この previous は「直前」の意味のようです。 > 「イベント指示子」のセクションにもそう書いてありますし。 「前に入力した」を「直前に入力した」に変更しました。 -- Masakazu Takahashi (emasaka)