215 votes

Pourquoi cURL renvoie-t-il l'erreur "(23) Failed writing body" ?

Il fonctionne bien en tant qu'outil unique :

curl "someURL"
curl -o - "someURL"

mais ça ne fonctionne pas dans un pipeline :

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

il revient :

(23) Failed writing body

Quel est le problème avec le piping de la sortie cURL ? Comment mettre en mémoire tampon la totalité de la sortie cURL et la traiter ensuite ?

4voto

damio Points 3042

Dans mon cas, je faisais : curl <blabla> | jq | grep <blibli>

Avec jq . ça a marché : curl <blabla> | jq . | grep <blibli>

3voto

neel229 Points 43

J'ai rencontré le même problème en faisant :

curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey | apt-key add -

La requête ci-dessus doit être exécutée en utilisant les privilèges de Root.

L'écrire de la manière suivante a résolu le problème pour moi :

curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey | sudo apt-key add -

Si vous écrivez sudo avant curl vous obtiendrez le Failed writing body erreur.

2voto

Marty Points 1097

J'ai rencontré ce message d'erreur en essayant d'installer varnish cache sur ubuntu. La recherche google m'a conduit ici pour l'erreur (23) Failed writing body C'est pourquoi je poste une solution qui a fonctionné pour moi.

Le bogue est rencontré lors de l'exécution de la commande en tant que Root curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -

la solution est d'exécuter apt-key add comme non racine

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

0voto

Robert Points 81

Dans Bash et zsh (et peut-être d'autres shells), vous pouvez utiliser la substitution de processus ( Bash / zsh ) pour créer un fichier à la volée, puis l'utiliser comme entrée pour le processus suivant dans la chaîne du pipeline.

Par exemple, j'ai essayé d'analyser la sortie JSON de cURL en utilisant jq y less mais il a reçu le Failed writing body erreur.

# Note: this does NOT work
curl https://gitlab.com/api/v4/projects/ | jq | less

Quand je l'ai réécrit en utilisant la substitution de processus, ça a marché !

# this works!
jq "" <(curl https://gitlab.com/api/v4/projects/) | less

Note : jq utilise son 2ème argument pour spécifier un fichier d'entrée

Bonus : Si vous utilisez jq comme moi et veulent garder la sortie colorée en less utilisez plutôt la ligne de commande suivante :

jq -C "" <(curl https://gitlab.com/api/v4/projects/) | less -r

(Merci à Kowaru pour leur explication de pourquoi Failed writing body se produisait. Cependant, leur solution consistant à utiliser tac deux fois n'a pas fonctionné pour moi. J'ai également voulu trouver une solution qui s'adapterait mieux aux gros fichiers et tenterait d'éviter les autres problèmes notés en commentaire de cette réponse).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X