改行に分割して割り当てzsh構造を分解する

改行に分割して割り当てzsh構造を分解する

2行を出力するコマンドがあります。

% ./run
one
two
%

だから出力はone\ntwo\n

first変数とsecond最初の行と2番目の行にそれぞれどのように割り当てることができますか?

コマンドを2回実行して両方の操作を実行する方法を知っています。

% first="$(./run | head -n 1)"
% second="$(./run | tail -n 1)"

2回実行したくなくて./run1回だけ呼び出したい(出力は毎回異なる場合があります)

./run出力を変数に保存してからその変数を操作できますが、この一時変数を使用する必要はありませんか?

ますます高度な言語が構造分解の割り当てを追加しています。

first, second = (./run).split('\n')

zshで同様のことができますか?

答え1

各行は別々の呼び出しで読み取られますread

IFS= read -r first
IFS= read -r second

たとえば、

$ unset first second
$ printf 'one\ntwo\n' | { IFS= read -r first; IFS= read -r second; }
$ print $first
one
$ print $second
two

上記の方法は、zsh別々のサブシェルでパイプの右側を実行しないように動作します。

または、次の手順で交換します。

$ unset first second
$ { IFS= read -r first; IFS= read -r second; } < <( printf 'one\ntwo\n' )
$ print $first
one
$ print $second
two

また、見ることができます「IFS=read-r-line」を理解する

関連情報