2行を出力するコマンドがあります。
% ./run
one
two
%
だから出力はone\ntwo\n
first
変数とsecond
最初の行と2番目の行にそれぞれどのように割り当てることができますか?
コマンドを2回実行して両方の操作を実行する方法を知っています。
% first="$(./run | head -n 1)"
% second="$(./run | tail -n 1)"
2回実行したくなくて./run
1回だけ呼び出したい(出力は毎回異なる場合があります)
./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」を理解する