macos bash curl osx-lion pipe

macos - ¿Por qué CURL return and error(23) Falló la escritura del cuerpo?



bash osx-lion (8)

Encontré este mensaje de error al intentar instalar caché de barniz en ubuntu. La búsqueda en google me llevó aquí por el error (23) Failed writing body , por lo tanto, publicando una solución que funcionó para mí.

El error se encuentra al ejecutar el comando como root curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add - curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -

la solución es ejecutar apt-key add como no root

curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -

Funciona bien como una herramienta única:

curl "someURL" curl -o - "someURL"

pero no funciona en una tubería:

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

vuelve:

(23) Failed writing body

¿Cuál es el problema en la tubería de la salida de curl? ¿Cómo almacenar en búfer todo el curl de salida y luego manejarlo?


(Para compleción y búsquedas futuras) Es una cuestión de cómo CURL administra el búfer, el búfer desactiva el flujo de salida con la opción -N.

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


El servidor se quedó sin espacio en disco, en mi caso.

Compruébalo con df -k .

Me alertaron de la falta de espacio en el disco cuando intenté conectarme a través de tac dos veces, como se describe en una de las otras respuestas: https://.com/a/28879552/336694 . Me mostró el error de write error: No space left on device mensaje de write error: No space left on device .


Entonces fue un problema de codificación. Iconv resuelve el problema

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


Esto sucede cuando un programa canalizado (por ejemplo, grep) cierra el conducto de lectura antes de que el programa anterior termine de escribir toda la página.

En curl "url" | grep -qs foo curl "url" | grep -qs foo , tan pronto como grep tenga lo que quiere, cerrará la secuencia de lectura del curl. cURL no espera esto y emite el error "Error al escribir el cuerpo".

Una solución es canalizar la transmisión a través de un programa intermediario que siempre lee toda la página antes de pasarla al siguiente programa.

P.ej

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

tac es un programa simple de Unix que lee toda la página de entrada e invierte el orden de las líneas (por lo tanto, lo ejecutamos dos veces). Debido a que tiene que leer toda la entrada para encontrar la última línea, no dará salida a grep hasta que termine cURL. Grep aún cerrará la secuencia de lectura cuando tenga lo que está buscando, pero solo afectará a tac, que no emite un error.


Otra posibilidad, si se usa la opción -o (archivo de salida), el directorio de destino no existe.

p.ej. si tiene -o /tmp/download/abc.txt y / tmp / download no existe.

Por lo tanto, asegúrese de que los directorios necesarios se creen / existan de antemano, use la opción --create-dirs así como también - o si es necesario


Puede hacer esto en lugar de usar la opción -o :

curl [url] > [file]


Tuve el mismo error pero por diferentes motivos. En mi caso tenía una partición (tmpfs) con solo 1GB de espacio y estaba descargando un archivo grande que finalmente llenó toda la memoria en esa partición y obtuve el mismo error que tú.