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

おすすめ記事