개행으로 분할하여 할당 zsh 구조 분해

개행으로 분할하여 할당 zsh 구조 분해

2줄을 출력하는 명령이 있습니다.

% ./run
one
two
%

그래서 출력은one\ntwo\n

first변수와 second첫 번째 행과 두 번째 행에 각각 어떻게 할당할 수 있나요?

명령을 두 번 실행하여 두 작업을 모두 수행하는 방법을 알고 있습니다.

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

두 번 실행하고 싶지 않고 ./run한 번만 호출하고 싶습니다(출력은 매번 다를 수 있음)

./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" 이해

관련 정보