
のドキュメントには、フラグが取るxargs
「replstr」についての記述があります-I
。これについて読み始めたとき、次のコマンドを実行するのを見つけましたfswatch
:
fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}
そして、manページを読み始めましたxargs
-I replstr
Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is
specified) arguments to utility with the entire line of input. The resulting arguments, after replacement is done, will not be
allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to
the constructed arguments to utility, up to 255 bytes. The 255 byte limit does not apply to arguments to utility which do not
contain replstr, and furthermore, no replacement will be done on utility itself. Implies -x.
「replstr」という用語について考えると、おそらく「読み取り、評価、印刷、ループ、文字列」のような意味のようですが、これはその略語でしょうか? 何をしているのか理解しようとして、いろいろ試してみました{}
が、まだよくわかりません。
➜ scripts git:(master) ✗ {0..3}
zsh: command not found: 0..3
➜ scripts git:(master) ✗ echo {0..3}
0 1 2 3
➜ scripts git:(master) ✗ echo {a..3}
a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3
➜ scripts git:(master) ✗ echo {a..d}
a b c d
➜ scripts git:(master) ✗ echo cats and dogs | xargs
cats and dogs
➜ scripts git:(master) ✗ echo cats and dogs | xargs {}
xargs: {}: No such file or directory
➜ scripts git:(master) ✗ echo cats and dogs | xargs {} echo {}
xargs: {}: No such file or directory
➜ scripts git:(master) ✗ echo cats and dogs | xargs -I {}
➜ scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {}
cats and dogs
たとえば、echo {a..3}
私にはまったく意味がわかりません。明らかに「この文字列のリストをここで置換する」という効果のあることを行っているようですが、それが正しい見方かどうかはわかりません。また、これが{}
特定のタイプの replstr なのか、他にもあるのかどうか、あるいは replstr は単に中括弧のペアの間にあるものなのかもわかりません。replstr とそのアプローチ方法についてのガイダンスをいただければ幸いです。
答え1
replstr
「置換文字列」または「置換文字列」を意味します。
元のreplstrは です。これは最初にコマンド句{}
で導入され、見つかった各ファイル名に置き換えられました。例:find
exec
find /tmp -name "foo*" -exec echo file {} found \;
2 つのファイルがパターンに一致すると仮定して、次のように表示されます。
file foo1 found
file foo2 found
このxargs
コマンドでは、標準入力に渡された文字列から構築された引数を使用して同じ操作を実行できるほか、{}
置換文字列とは異なる文字列を指定することもできます。
デフォルトの replstr は{}
中括弧内に何も入っていないことに注意してください。中括弧は、すでにお気づきの範囲やパラメータ拡張など、さまざまな目的で使用されます。
答え2
引数-I
は次のように動作します:-I whatever
は、文字どおりの出現がwhatever
コマンド引数に置き換えられることを意味します。デモ:
$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c
わかりましたか? 、、のxargs
各行を取り、のの代わりにそれらを置き換えました。a
b
c
f
echo hey f hey f
関与はありません{}
。
オプション-I
は POSIX です。GNU は、として呼び出された場合、のように動作するxargs
非推奨のオプションを文書化しています。 として呼び出された場合、のように動作します。この場合、 の出現は置き換えられます。は、の機能、つまりその述語に明らかに影響を受けています。-i
-iwhatever
-I whatever
-i
-I {}
{}
{}
find
-exec
およびBash 構文は{a..b}
、foo{a,b,c}bar
その「中括弧展開」によって処理されます。{}
特別な意味はなく、そのままコマンドに渡されます。(そうでない場合、標準に準拠した一般的なfind
呼び出しが中断されます。)
答え3
は{...}
シェルのブレース拡張は、 のようなリスト( 、{a,b,c}
に展開されます)、および のような数値のシーケンス( 、... 、に展開されます) または文字( 、、、 ) をサポートします。(中括弧の展開は、 で使用されるプレースホルダーとは関係ありません)。a
b
c
{0..13}
0
1
12
13
{a..d}
a
b
c
d
{}
xargs
展開するとやや奇妙なシーケンス{a..3}
になるが、これはASCII文字表a
は数値ではないので、両方とも文字として扱われ、文字コードの数値によってa
との間のすべての文字が展開されます。の後に が来るので、シーケンスは大文字と 9 から 3 までの数字を下に向かって進みます。3
a
3
ご覧のとおり、このような範囲で文字と数字を混在させることはあまり有用ではありませんが、{a..z}
または は有用かもしれません。また、正規表現やシェル グロブの{A..Z}
および も同様です。(つまり、残りの文字を無視できる場合です。)[a-z]
[A-Z]