一連の数字を印刷してから最後に何かを追加するのに問題があります。
seq 1 3 | xargs -I {} echo {} 4
明らかにする
1 4
2 4
3 4
しかし、結果が出てほしい
1 2 3 4
私は学んでいるので、これを達成するためにxargs
それを使用したいと思いますxargs
。
答え1
command
GNUを介して単一の呼び出しに特定の行数を引数として渡すには、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
あなたができることは、sh
ellを呼び出して実行することです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
$@
xargs
bang
0
command_name
sh
$ 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つ以上の引数が渡されたことを確認することもできます-r
。sh
cmd1 | xargs sh -c '[ "$#" -eq 0 ] || exec cmd2 "$@" additional args' sh
これにより、exec
シェル実装でフォークが節約されますが、最適化は自動的には行われません。などの組み込みコマンドの場合、echo
一部のsh
実装(例:bash)では次のexec
ものを使用します。外部組み込みコマンドの代わりに使用可能な場合に呼び出されるコマンドで、sh
使用しないときと同様に動作します( xargs cmd2
)。