সিআরএল কেন ত্রুটি "(23) ব্যর্থ লেখার ব্যর্থতা" ফেরায়?


152

এটি একক সরঞ্জাম হিসাবে ঠিক কাজ করে:

curl "someURL"
curl -o - "someURL"

তবে এটি পাইপলাইনে কাজ করে না:

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

এটি ফিরে আসে:

(23) Failed writing body

সিআরএল আউটপুট পাইপিংয়ে সমস্যা কী? কীভাবে পুরো সিআরএল আউটপুটটি বাফার করবেন এবং তারপরে এটি পরিচালনা করবেন?


1
আমার জন্য এটি কাজ করে, বাফার করার দরকার নেই।
hek2mgl

1
পাইপলাইনেও কি এটি কাজ করে ?:curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | tr -d '\n'
স্থির

1
ওএসএক্স ট্যাগ যুক্ত করা হয়েছে। দুর্ভাগ্যক্রমে আমি এই সাহায্য করতে পারি না। আমি লিনাক্স ব্যবহার করছি
hek2mgl

1
সমস্যাটি ছিল পৃষ্ঠাটির এনকোডিং (সিরিলিক, উইন -১৫১১)। সুতরাং আমি অবশ্যই ব্যবহার করতে হবেiconv -f ...
স্থির

5
ঠিক যেমনটি অন্য একটি ইঙ্গিত: খনি ব্যর্থ হয়েছে, কারণ ডিস্কটি পূর্ণ ছিল।
ভিন্স ভার্গা

উত্তর:


113

পূর্ববর্তী প্রোগ্রামটি পুরো পৃষ্ঠাটি লেখা শেষ করার আগে কোনও পাইপযুক্ত প্রোগ্রাম (যেমন গ্রেপ) পঠিত পাইপটি বন্ধ করে দিলে এটি ঘটে This

ভিতরে curl "url" | grep -qs foo , গ্রিপ যত তাড়াতাড়ি যা চায় তা তা কার্ল থেকে পঠিত স্ট্রিমটি বন্ধ করে দেবে। সিআরএল এটি আশা করে না এবং "ব্যর্থ লিখন বডি" ত্রুটিটি প্রকাশ করে।

একটি মধ্যস্থতাকারী প্রোগ্রামের মাধ্যমে স্রোতটি পাইপ করা একটি কাজ যা পরবর্তী প্রোগ্রামটিতে খাওয়ানোর আগে পুরো পৃষ্ঠাটি সর্বদা পঠন করে।

যেমন

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

tacএকটি সাধারণ ইউনিক্স প্রোগ্রাম যা পুরো ইনপুট পৃষ্ঠাটি পড়ে এবং লাইন ক্রমটিকে বিপরীত করে (অতএব আমরা এটি দুটিবার চালাই)। কারণ শেষ লাইনটি খুঁজতে এটি পুরো ইনপুটটি পড়তে হয়, এটি সিআরএল সমাপ্ত না হওয়া পর্যন্ত গ্রেপ-তে কোনও কিছুই আউটপুট দেয় না। গ্রেপ এখনও এটি পড়ার স্ট্রিমটি বন্ধ করবে যখন এটি যা খুঁজছে তা রয়েছে, তবে এটি কেবল ট্যাককেই প্রভাবিত করবে যা কোনও ত্রুটি নির্গত করে না।


5
আপনি catএকবারে কেবল এটি পাইপ করতে পারেন না ? আমার জন্য সমস্যাটি কমপক্ষে সমাধান করে।
benvd

4
না। এটি ছোট দস্তাবেজগুলিতে সহায়তা করতে পারে তবে এটি বাফার বিড়ালটিতে ফিট করার জন্য খুব বড় হলে ত্রুটিটি আবার উপস্থিত হবে You -sআপনি সমস্ত ত্রুটি বার্তাগুলি (এবং অগ্রগতি) নীরবতার জন্য ব্যবহার করতে পারেন যদি আপনার প্রয়োজন না হয়।
কাওড়ু

8
tac|tacইনপুট পরিবর্তন করে যদি ইনপুটটি কোনও লাইনফিডের সাথে শেষ না হয় বা উদাহরণস্বরূপ যেখানে লাইনফিড থাকে তা printf a\\nb\\nc|tac|tacমুদ্রণ করে । পরিবর্তে আপনি ব্যবহার করতে পারেন । অন্য বিকল্পটি হ'ল , তবে যখন ইনপুটটিতে জ্যাশ ছাড়া অন্য শেলগুলিতে নাল বাইট থাকে, তা হয় নাল বাইটগুলি এড়িয়ে যায় বা প্রথম নাল বাইটের পরে পড়া বন্ধ করে দেয়। a\ncb\nsponge /dev/stdoutprintf %s\\n "$(cat)"
নিসেটামা

দস্তাবেজগুলি থেকে: CURLE_WRITE_ERROR (23) একটি স্থানীয় ফাইলে প্রাপ্ত ডেটা লেখার সময় একটি ত্রুটি ঘটেছে, বা লিখিত কলব্যাক থেকে একটি ত্রুটি libcurl এ ফিরে এসেছে। curl.haxx.se/libcurl/c/libcurl-erferences.html
জর্ডান স্টুয়ার্ট

2
এই গৃহীত উত্তর, কারণ এটি সমস্যা ব্যাখ্যা করা উচিত altought এটা সক্ষম সমাধান উপলব্ধ করা হয় না সেখানে নেই tacMacOS কমান্ড
ডমিনিক বুচার

48

সম্পূর্ণতা এবং ভবিষ্যতের অনুসন্ধানের জন্য:

সিআরএল কীভাবে বাফারকে পরিচালনা করে তা ব্যাপার, বাফার -N বিকল্পের সাহায্যে আউটপুট স্ট্রিমটি অক্ষম করে।

উদাহরণ: curl -s -N "URL" | grep -q Welcome


8
এটি curl -s https://raw.githubusercontent.com/hermitdave/FrequencyWords/master/content/2016/ro/ro_50k.txt | head -20( -sআমি একই ত্রুটি না পেয়ে) কাজ করেছিলাম।
ড্যান ড্যাসক্লেস্কু

24

আরেকটি সম্ভাবনা, যদি এটি ব্যবহার করে -o (আউটপুট ফাইল) বিকল্পটি - গন্তব্য ডিরেক্টরি উপস্থিত নেই।

যেমন। যদি আপনার -o /tmp/download/abc.txtএবং / tmp / ডাউনলোডের অস্তিত্ব না থাকে।

অতএব, নিশ্চিত করুন যে কোনও প্রয়োজনীয় ডিরেক্টরি আগে তৈরি / উপস্থিত রয়েছে, --create-dirsঅপশনটি পাশাপাশি ব্যবহার করুন - oপ্রয়োজনে


2
ধন্যবাদ, - ক্রিয়েট-ডায়াররা আমার পক্ষে এটি সবচেয়ে অস্বাভাবিক পরিস্থিতিতে সমাধান করেছিল, কোনটি ভুল তা কখনই বুঝতে পারেনি, তবে এটিই ছিল টিকিট!
rfay

1
ঠিক আমার সাথে একই ঘটনা ঘটেছে। আমি আউটপুটটির জন্য ভেরিয়েবলটি ঘোষণা করতে ভুলে গেছি। ধন্যবাদ, মাইক
মিনকং হুয়াং

8

সুতরাং এটি এনকোডিংয়ের সমস্যা ছিল। আইকনভ সমস্যা সমাধান করে

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

8

-oবিকল্পটি ব্যবহার না করে আপনি এটি করতে পারেন :

curl [url] > [file]


সুতরাং, পাইপটি ব্যবহার না করে এবং এর পরিবর্তে সমস্ত ফাইল ফাইল সিস্টেমের মধ্যে দিয়ে যায়? আমি পাইপের সাহায্যে কার্লের আউটপুটটি ব্যবহার করতে চাই।
স্থির

6

আমার একই ত্রুটি ছিল তবে ভিন্ন কারণ থেকে। আমার ক্ষেত্রে আমার (টিএমপিএফস) পার্টিশনটি ছিল মাত্র ১ জিবি স্পেস সহ এবং আমি বড় ফাইলটি ডাউনলোড করছিলাম যা অবশেষে partition পার্টিশনের সমস্ত স্মৃতি পূরণ করেছিল এবং আমি আপনার মতো ত্রুটি পেয়েছি।


5

আমার ক্ষেত্রে সার্ভারটি ডিস্কের জায়গার বাইরে চলে গেছে।

এটি দিয়ে পরীক্ষা করুন df -k .

আমি যখন tacঅন্য উত্তরগুলির মধ্যে বর্ণিত হয়েছে, দু'বার পাইপ করার চেষ্টা করছিলাম তখন ডিস্ক জায়গার অভাব সম্পর্কে আমি সতর্ক হয়েছি : https://stackoverflow.com/a/28879552/336694 । এটি আমাকে ত্রুটির বার্তাটি দেখিয়েছে write error: No space left on device


একটি ধারকটির মধ্যে ডিস্কের জায়গা ছাড়ার কারণে আমি একই ত্রুটি পেয়েছি কারণ অন্য যে কেউ একই সমস্যাটিকে আঘাত করে তাদের পাত্রে স্থান পরিষ্কার করতে পারেdocker system prune
ডেভ

2

উবুন্টুতে বার্নিশ ক্যাশে ইনস্টল করার চেষ্টা করার সময় আমি এই ত্রুটি বার্তার মুখোমুখি হয়েছি। গুগল অনুসন্ধান ত্রুটির জন্য আমাকে এখানে পৌঁছেছে (23) Failed writing body, তাই আমার জন্য কার্যকর সমাধান পোস্ট করে।

রুট হিসাবে কমান্ড চালানোর সময় বাগটি সম্মুখীন হয় curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -

সমাধানটি apt-key addঅ মূল হিসাবে চালানো

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

1

আপনি যদি অনুরূপ কিছু চেষ্টা source <( curl -sS $url )করে (23) Failed writing bodyযাচ্ছেন এবং ত্রুটিটি পেয়ে থাকেন তবে এটি হ'ল কোনও প্রক্রিয়া সাবস্টিটিউশনের পক্ষে কাজ করা কাজ করে নাbash 3.2 (ম্যাকোসের জন্য ডিফল্ট) ।

পরিবর্তে, আপনি এই workaround ব্যবহার করতে পারেন।

source /dev/stdin <<<"$( curl -sS $url )"

0

আমার জন্য, এটি অনুমতি ইস্যু ছিল। ব্যবহারকারীর প্রোফাইলে ডকার রান বলা হয় তবে মূলটি ধারকটির ভিতরে থাকা ব্যবহারকারী। সমাধানটি ছিল / tmp এ কার্ল রাইটিং করা যেহেতু এতে কেবল সমস্ত রুট নয়, সমস্ত ব্যবহারকারীর জন্য লেখার অনুমতি রয়েছে।

আমি -o বিকল্পটি ব্যবহার করেছি।

-o / tmp / file_to_download


-1

বাশ এবং জেডএসে (এবং সম্ভবত অন্যান্য শেলস), আপনি প্রক্রিয়া প্রতিস্থাপন ( বাশ / জেডএস ) ব্যবহার করতে পারেন একটি ফাইল তৈরি ) , এবং তারপরে পাইপলাইন শৃঙ্খলে পরবর্তী প্রক্রিয়ার ইনপুট হিসাবে এটি ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, আমি সিআরএল ব্যবহার করে জেএসএন আউটপুট পার্স করার চেষ্টা করছিলাম jqএবং lessতবে Failed writing bodyত্রুটি পাচ্ছিলাম ।

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

আমি যখন প্রক্রিয়া প্রতিস্থাপন ব্যবহার করে এটি পুনরায় লিখি, এটি কাজ করেছিল!

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

দ্রষ্টব্য: jqএকটি ইনপুট ফাইল নির্দিষ্ট করতে এর দ্বিতীয় যুক্তি ব্যবহার করে

বোনাস: আপনার ব্যবহার করেন, তাহলে jqআমার মত এবং করতে চান রঙী আউটপুট রাখা মধ্যে less, পরিবর্তে নিম্নলিখিত কমান্ড লাইন ব্যবহার করে:

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

( কেন ঘটছে তা বোঝার জন্য কাউয়ারুকে ধন্যবাদ । তবে, তাদের দুবার ব্যবহারের সমাধানটি আমার পক্ষে কার্যকর হয়নি large আমি আরও একটি ফাইল সন্ধান করতে চেয়েছিলাম যা বড় ফাইলগুলির পক্ষে আরও ভাল স্কেল করে এবং অন্যান্য সমস্যাগুলি মন্তব্য হিসাবে চিহ্নিত করার এড়াতে চেষ্টা করে যে উত্তর।) Failed writing bodytac

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.