私は奇妙な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 )
または(bash
4.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
readarray
stdinで読むことも可能です。
readarray arr <<< "$(echo a; echo b; echo c)"; echo ${#arr[@]}