임시 파일을 사용하는 것 외에 입력을 버퍼링할 수 있지만 stdin
가져오는 동안 오류가 발생하는 방법/프로그램이 있습니까 EOF
? 또한 쉘 변수(예: )를 사용하고 싶지 않습니다 buffer=$(cat)
.
프로그램은 다음과 같아야 합니다(프로그램 이름이 이라고 가정 buffered-cat
).
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
이제 프로그램은 이를 수신 ^D
하고 buffered-cat
내용을 출력합니다.
line 1
line 2
line 3
답변1
당신은 이것을 할 수 있습니다sponge
moreutils에서. sponge
"표준 입력을 받아 파일에 씁니다". 인수가 없으면 파일은 표준 출력입니다. 명령에 대한 입력은 EOF까지 메모리에 저장되었다가 한 번에 모두 기록됩니다.
일반 파일에 쓰려면 파일 이름만 지정하면 됩니다.
cmd | sponge filename
주요 목적 sponge
은 파이프에서 동일한 파일을 읽고 쓸 수 있도록 하는 것이지만 사용자의 요구 사항에도 적합할 수 있습니다.
답변2
가난한 사람이 sponge
사용하고 있습니다 awk
:
awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}'
당신이 가지고 있다면tac
, 이를 남용할 수도 있습니다.
... | tac | tac
답변3
입력이 ASCII 텍스트(끝까지 NUL 0x0 바이트를 포함하지 않음)인 경우 sed -z
원하는 것을 수행하십시오.
$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$
-z
sed
NUL 바이트가 일반적인 개행 문자 대신 줄 구분 기호로 처리되는 이유 입니다. 따라서 입력이 NUL 바이트가 없는 일반 텍스트인 경우 sed는 EOF에 도달할 때까지 전체 입력을 모드 버퍼로 계속 읽습니다. sed
그런 다음 버퍼에 대해 아무 작업도 수행하지 않고 출력합니다.
입력에 NUL 바이트가 있는 경우 다음을 수행할 수 있습니다.
sed ':l;N;bl'
답변4
Python을 제외하고는 muru의 awk 예제와 동일한 아이디어입니다. CtrlD한 줄씩 읽기를 중지 하는 데 사용됩니다 .
$ python -c 'import sys;print("".join(sys.stdin.readlines()))'
line1
line2
line3 # press Enter and Ctrl+D at this point
line1
line2
line3