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