[JM:00860] Re: GNU_findutils/xargs.1 への指摘

アーカイブの一覧に戻る

長南洋一 cyoic****@maple*****
2013年 4月 3日 (水) 12:46:25 JST


長南です。

元木さんのメールより [JM:00859]
> 
> この時は、 xargs を使う方がメインだったので、最初の文章しか見ませんでした。
> 後半の部分もよく分からなかったのは事実です。
> その場は、本来やりたいことが実現できたので、終わってしまいました。
> 
> 今見てみました。
> 
> Also, unquoted blanks do not terminate input items;
> instead the separator is the newline character.
> 
> なお、空白は、クォートされていない場合も、入力される項目の区切りにはならない。
> 区切り記号は改行文字だけになるのだ。
> 
> という部分ですね。
> 
> ここで言いたいのは、xargs -I XXXXX some command -o XXXXX foo bar みたいにした場合に、
> 標準入力から受け取った項目にクォートされていない空白が含まれていた場合には、
> そのまま展開される、つまり入力が "aaa bbb" だと some command -o aaa bbb foo bar という
> コマンドラインに展開される、ということの注意喚起だと思います。

ええ、そういう場合もあります。それから、次のような場合もあります。
ちょっと単純すぎて非現実的な xargs -I の使用法になりますが、"with spc" と
"withoutspc" という二つのファイルがあるとします。

  $ ls |xargs file
  with:       ERROR: cannot open `with' (No such file or directory)
  spc:        ERROR: cannot open `spc' (No such file or directory)
  withoutspc: UTF-8 Unicode text

  $ ls |xargs -I XX file XX
  with spc: ASCII text
  withoutspc: UTF-8 Unicode text

つまり、この文は、標準入力から入力されるファイル名が空白を含んでいても、
-I オプションのときは、ちゃんと処理しますよ、という保証でもあるわけです。

別の言い方をすると、この部分は、「説明」中の次の二つの部分に対応しています。

  ... xargs は、標準入力から空白や改行で区切られた一連の項目を読み込み
  (空白はダブルクォート、シングルクォート、バックスラッシュによって
  保護できる)、それを引き数にして ...

   Unix ではファイル名に空白や改行を含むことが可能なので、このデフォルト
   の動作は、しばしば問題を引き起こす。

> 訳はなかなか難しいですが、意訳をすると、
> 
>    入力項目の区切りは改行文字であり、クォートされていない空白があったと
> しても項目はそこで終わりにはならない点に注意すること。
> 
> といった感じでしょうか。

注意喚起と保証と両方を考慮に入れると、[JM:00850] に書いた訳案にちょっと
手を入れて、こんなところではないでしょうか。

  なおこのとき、標準入力中にある空白は、クォートされていない場合でも、
  入力項目の区切りにはならない。項目の区切りは改行文字だけになるのだ。

オプションの説明の全文を掲載してみます。どうせですから、原文から。

  -I replace-str
    Replace occurrences of replace-str in the initial-arguments with
    names read from standard input.  Also, unquoted  blanks  do  not
    terminate  input  items;  instead  the  separator is the newline
    character.  Implies -x and -L 1.

  -I replace-str
    xargs が実行するコマンドにに対して、ユーザが引き数 (すなわち 上記書式
    の initial-arguments) を指定したとき、その initial-arguments 中にある
    replace-str の部分をすべて、標準入力から読み込んだ名前で置き換える。
    このとき、標準入力中にある空白は、クォートされていない場合でも、
    入力項目の区切りにはならない。項目の区切りは改行文字だけになるのだ。
    なお、-x と -L 1 が自動的に設定される。

元木さんの案を取り入れると、

    xargs が実行するコマンドにに対して、ユーザが引き数 (すなわち 上記書式
    の initial-arguments) を指定したとき、その initial-arguments 中にある
    replace-str の部分をすべて、標準入力から読み込んだ名前で置き換える。
    このとき、標準入力中にクォートされていない空白があっても、それは
    入力項目の区切りにはならない。項目の区切りは改行文字だけになるのだ。
    なお、-x と -L 1 が自動的に設定される。

どちらでもよさそうです。どちらかといえば、文章の柔らかさという点で、
後者かな。

「(上記書式の  initial-arguments)」という訳注を前にも 1 回使っている
ので、翻訳したときには「(すなわち initial-arguments)」だけにしたのですが、
やはり「上記書式」があった方がよいかもしれません。結局、この前半部分は、
initial-arguments がピンとこないのでしょうから。後半は、「空白は」と
文を始めるのが唐突だったのだと思います。

まだイマイチかもしれません。でも、マニュアルのこういうところは、一度
読んだだけではわからず、実際に動かしてみて、ああそうなのかと納得する
ところではないでしょうか。もちろん、読んだだけでわかるように訳したいと
思ってはいますが。

-- 
長南洋一




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