長南洋一
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 がピンとこないのでしょうから。後半は、「空白は」と 文を始めるのが唐突だったのだと思います。 まだイマイチかもしれません。でも、マニュアルのこういうところは、一度 読んだだけではわからず、実際に動かしてみて、ああそうなのかと納得する ところではないでしょうか。もちろん、読んだだけでわかるように訳したいと 思ってはいますが。 -- 長南洋一