空の配列があります
arr=()
xargs
この配列に要素を追加するために使用できるものはありますか?
このように:
echo "test" | xargs arr+=()
答え1
いいえ、それは不可能です。このxargs
ツールは、取得した入力量に応じて外部ユーティリティを1回以上実行します。配列の割り当ては外部ユーティリティの名前ではない可能性が高いため実行されません。また、xargs
ツール自体は外部ユーティリティなので、現在のシェル環境では何も変更できません。
これは簡単です。
arr+=( test )
または、コマンドから配列を読みたい場合(コマンド出力の1行に1つの要素):
readarray -t -O "${#arr[@]}" arr < <( some_command )
これにより、配列の末尾に新しい要素が追加され始め、arr
出力の各行がsome_command
新しい配列要素に読み込まれます。この-O
オプションは、データが挿入される配列のオフセットを決定し、配列の長さ"${#arr[@]}"
だけ拡張されますarr
。したがって、配列の現在の端からデータの挿入を開始しますarr
。効果は配列に要素を追加することです。
前のコマンドをテストします。
$ arr=( 1 2 3 )
$ readarray -t -O "${#arr[@]}" arr < <( printf 'a\nb\nc\n' )
$ printf '%s\n' "${arr[@]}"
1
2
3
a
b
c
1
この例では、要素が追加されていることを示すために、2
3つの要素を持つ配列で始まります。3
配列は最初は空である可能性があります。
配列が次の場合みんな知ってる空または希望する場合
変える要素を配列に追加し、オプションなしでコマンドを使用します-O
。
readarray -t arr < <( some_command )
上記のコマンドは変えるarr
コマンドの出力行から要素を取得した配列のすべての要素ですsome_command
。
help mapfile
およびbash
マニュアルも参照してください(readarray
コマンドとmapfile
コマンドは同じです)。
答え2
親プロセス(Bashなど)が子プロセス(xargsなど)を開始すると、子プロセスは環境のコピー(配列変数arrを含む)を取得し、プロセスはその環境を更新できますが、終了すると、次のようになります。親プロセスに戻りません。
したがって、通常、あなたの質問に対する答えは「いいえ」です。
さらに重要なのは、xargsが環境変数を更新できず、他のコマンドを実行するだけです。