zsh의 stdin에서 n 문자를 읽는 방법은 무엇입니까?

zsh의 stdin에서 n 문자를 읽는 방법은 무엇입니까?

Bash에서는 파이프에서 3개의 문자를 읽으려면 다음을 수행합니다.

... | read -n3

존재하다지쉬의read, 가장 가까운 옵션은 다음과 같습니다 -k.

-k[일련번호]
하나만 읽으십시오(또는일련번호) 수치. 모두 첫 번째에 할당됨 이름, 분사가 필요하지 않습니다. 이 플래그는 -q존재하는 경우 무시됩니다. -u또는 중 하나가 없으면 터미널에서 입력을 읽습니다 -p. 이 옵션은 zle 위젯에서도 사용할 수 있습니다.

MULTIBYTE니모닉 "키"에도 불구하고 이 옵션은 전체 문자를 읽으며 옵션이 설정된 경우 여러 바이트를 포함할 수 있습니다.

및 :-u-p

-u N
파일 설명자에서 입력 읽기N.

-p
입력은 코프로세스에서 읽혀집니다.

Naked가 echo foobar | (read -k3; echo $REPLY)입력을 기다리는 중입니다. -pdisplay 에서는 실패합니다 read: -p: no coprocess. 다음만 작동합니다.

echo foobar | (read -k3 -u0; echo $REPLY)

bash보다 zsh에서 구현하기가 더 어려운 것을 본 것은 이번이 처음입니다.

표준 입력(무엇이든)에서 N 문자를 읽는 것보다 더 쉬운 방법이 있습니까?

답변1

조금 이상하긴 하지만 사실이에요녹음된:

-k[일련번호]

-u(…) 또는 중 하나가 없으면 터미널에서 입력을 읽습니다 -p.

첫 번째 시도가 중단되는 이유는 터미널에서 읽는 중이기 때문입니다. 차단을 해제하려면 터미널에 세 글자를 입력하세요. 전체 줄이 아닌 제한된 수의 문자를 요청할 때( -k또는 사용 -q) 표준 입력에서 읽으려면 -u 0명시적으로 전달해야 합니다.

echo foobar | ( read -u 0 -k 3; echo $REPLY )

답변2

서브쉘 없이도 작동합니다.

% echo foobar | read -k3 -u0; echo $REPLY
foo
% echo $ZSH_VERSION
5.5.1

관련 정보