[macos] cURL이 왜“(23) 본문 쓰기 실패”오류를 반환합니까?

단일 도구로 작동합니다.

curl "someURL"
curl -o - "someURL"

그러나 파이프 라인에서는 작동하지 않습니다.

curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'

다음을 반환합니다.

(23) Failed writing body

cURL 출력 파이핑의 문제점은 무엇입니까? 전체 cURL 출력을 버퍼링하고 처리하는 방법은 무엇입니까?



답변

파이프 된 프로그램 (예 : grep)이 전체 페이지 쓰기를 마치기 전에 이전 프로그램이 읽기 파이프를 닫을 때 발생합니다.

에서 curl "url" | grep -qs foogrep이 원하는 것을 갖 자마자 curl에서 읽기 스트림을 닫습니다. cURL은이를 예상하지 않으며 “실체 쓰기 실패”오류를 발생시킵니다.

해결 방법은 다음 프로그램으로 보내기 전에 항상 전체 페이지를 읽는 중개 프로그램을 통해 스트림을 파이프하는 것입니다.

예 :

curl "url" | tac | tac | grep -qs foo

tac전체 입력 페이지를 읽고 행 순서를 반대로하는 간단한 Unix 프로그램입니다 (따라서 두 번 실행 함). 마지막 줄을 찾으려면 전체 입력을 읽어야하므로 cURL이 완료 될 때까지 grep에 아무것도 출력하지 않습니다. Grep은 찾고있는 내용이있을 때 여전히 읽기 스트림을 닫지 만 오류에 영향을 미치지 않는 tac에만 영향을 미칩니다.


답변

완전성과 향후 검색을 위해 :

cURL이 버퍼를 관리하는 방식과 관련하여 버퍼는 -N 옵션으로 출력 스트림을 비활성화합니다.

예:
curl -s -N "URL" | grep -q Welcome


답변

-o(출력 파일) 옵션을 사용하는 경우 다른 가능성 이 있습니다. 대상 디렉토리가 없습니다.

예. 가지고 -o /tmp/download/abc.txt있고 / tmp / download가없는 경우

따라서, 필요한 디렉토리가 생성되도록 / 사전 존재, 사용 --create-dirs옵션을뿐만 아니라 – o필요한 경우


답변

인코딩 문제였습니다. Iconv는 문제를 해결합니다

curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | iconv -f windows-1251 | tr -dc '[:print:]' | ...


답변

-o옵션 을 사용하는 대신이 작업을 수행 할 수 있습니다 .

curl [url] > [file]


답변

나는 같은 오류가 있었지만 다른 이유에서 왔습니다. 내 경우에는 1GB 공간의 (tmpfs) 파티션이 있었고 마침내 해당 파티션의 모든 메모리채운 큰 파일을 다운로드하고 있었고 동일한 오류가 발생했습니다.


답변

필자의 경우 서버에 디스크 공간이 부족합니다.

그것을 확인하십시오 df -k .

https://stackoverflow.com/a/28879552/336694tac 에서 설명한 것처럼 두 번의 파이핑을 시도했을 때 디스크 공간이 부족하다는 경고를 받았습니다 . 오류 메시지가 표시되었습니다 write error: No space left on device.