readarray(またはパイプ)の問題

readarray(またはパイプ)の問題

私は奇妙なreadarray命令を続けました。

私たちman bashを:

readarray
     Read lines from the standard input into the indexed array variable array

ただし、次のスクリプトは機能しません(配列が空です)。

unset arr; (echo a; echo b; echo c) | readarray arr; echo ${#arr[@]}
unset arr; cat /etc/passwd | readarray arr;  echo ${#arr[@]}

これらのタスクは次のとおりです。

unset arr; readarray arr < /etc/passwd ;  echo ${#arr[@]}
unset arr; mkfifo /tmp/fifo; (echo a; echo b; echo c) > /tmp/fifo & mapfile arr < /tmp/fifo ; echo ${#arr[@]}

水道管に何の問題がありますか?

答え1

現在のシェルでコマンドを実行するには、readarrayパイプの代わりにプロセス置換を使用します。

readarray -t arr < <( echo a; echo b; echo c )

または(bash4.2以降の場合)lastpipeシェルオプションを使用してください。

shopt -s lastpipe
( echo a; echo b; echo c ) | readarray -t arr

2番目の方法は、デフォルトではlastpipe対話型セッションでは機能しません。この場合は、まず実行してみてください。

set +m

「モニターモード」を無効にします。

答え2

たぶん試してみてください:

unset arr
printf %s\\n a b c | {
    readarray arr
    echo ${#arr[@]}
}

{動作すると予想しましたが、パイプの最後の最後のシェルコンテキストから出ると、変数の値が失われます。これは、パイプラインの各個々のプロセスがサブシェルで実行されるためです。したがって、お客様の製品は同じ理由で動作しません。; }||||()

( arr=( a b c ) ) ; echo ${arr[@]}

... no - 変数の値が設定されます。その他呼び出したプロセスの代わりにシェルプロセスを使用します。

答え3

readarraystdinで読むことも可能です。

readarray arr <<< "$(echo a; echo b; echo c)"; echo ${#arr[@]}

関連情報