xargs は、複数の行を単一のコマンド呼び出しの引数として扱います。

xargs は、複数の行を単一のコマンド呼び出しの引数として扱います。

一連の数字を印刷してから最後に何かを追加するのに問題があります。

seq 1 3 | xargs -I {} echo {} 4

明らかにする

1 4
2 4
3 4

しかし、結果が出てほしい

1 2 3 4

私は学んでいるので、これを達成するためにxargsそれを使用したいと思いますxargs

答え1

commandGNUを介して単一の呼び出しに特定の行数を引数として渡すには、xargs次のコマンドを実行できます。

multi-line cmd | xargs -d '\n' -n N command

\nつまり、区切り文字として使用され、一度に1N行を渡すことは実行するのと同じです。command

command line1 line2 ... lineN  

次にxargs、次のようにします。

input | xargs [options] [command [initial-arguments]]

つまり、ビルド時にコマンドラインに追加されたすべてのパラメータは、xargs初期パラメータの後に表示されます。command

multi-line cmd | xargs -d '\n' -n N command initial-args

実行されます

command initial-args line1 line2 ... lineN  

だからあなたは走ることはできません。

seq 1 3 | xargs -d '\n' -n 3 echo 4

4初期パラメータとして処理され、最終結果は次のようになるため、予想される出力が得られます。

4 1 2 3

あなたができることは、shellを呼び出して実行することですcommand。これにより、最後に追加のパラメータを追加できます。

seq 1 3 | xargs -d '\n' -n 3 sh -c 'echo "$@" 4' bang
1 2 3 4

bang上記の行に何と書かれていますか?sh -c 通事論はい

sh -c command_string [command_name [argument...]]

したがって、(位置パラメータに展開されます。この場合によって追加されたパラメータ)'echo "$@" 4'特殊パラメータです(たとえば、任意の名前を使用できます)。読む価値があります。command_string$@xargsbang0command_namesh$ 0が位置パラメータではないのはなぜですか?


xargs私の投稿はGNUとその独自のスイッチに言及していることに注意してください-d。または、シェルでこれを実行して出力行を配列に保存し、その要素をcommand別の引数の前に引数として渡すこともできます
bash

readarray -t args < <(multi-line cmd)
command "${args[@]}" additional-arg(s)

またはzsh

args=("${(@f)$(multi-line cmd)}")
command "${args[@]}" additional-arg(s)

1: この線が限界内にあるとN仮定します。ARG_MAX

答え2

一部の行を単一行に変更することによって行われますpaste -s

この例では、4つの行を1つの行に変更しようとしています。この4行は次のコマンドで作成されましたseq 1 3; echo 4

$ seq 1 3; echo 4
1
2
3
4

これを渡してpaste -d ' ' -s -行に変換し、各元の行を空白文字で区切ります。

$ { seq 1 3; echo 4; } | paste -d ' ' -s -
1 2 3 4

tr '\n' ' 'byの代わりにby行を渡すこともできますが、そうすればpaste -s最後の改行文字(後の文字4)が空白に変わりますが、これはおそらくあなたが望むものではないでしょう。

答え3

xargs部分が良いです。 seq は次の区切り文字を使用できます。

seq -s ' ' 1 3 | xargs -I {} echo {} 4

答え4

BSDでは、このオプションは次のように使用されます-J

$ seq 3 | xargs -J {} echo {} 4
1 2 3 4

それにもかかわらず、xargsパラメータリストが大きすぎて制限を超えた場合でも、コマンドは複数回呼び出されますexecve()

他のxargs実装では、すでに述べたように、shパラメータの順序を変更できます。

$ seq 3 | xargs sh -c 'echo "$@" 4' sh
1 2 3 4

xargsこのオプションをサポートしていない実装では、1つ以上の引数が渡されたことを確認することもできます-rsh

cmd1 | xargs sh -c '[ "$#" -eq 0 ] || exec cmd2 "$@" additional args' sh

これにより、execシェル実装でフォークが節約されますが、最適化は自動的には行われません。などの組み込みコマンドの場合、echo一部のsh実装(例:bash)では次のexecものを使用します。外部組み込みコマンドの代わりに使用可能な場合に呼び出されるコマンドで、sh使用しないときと同様に動作します( xargs cmd2)。

関連情報