সিআরএল: পুনর্নির্দেশের সময় কীভাবে অদ্ভুত আউটপুট দমন করবেন?


67

আমি stderrব্যাশ শেল থেকে একটি সিআরএল অনুরোধের (যা পাঠানো হয়েছে ) কেবল ভার্ভোজ বিভাগগুলি মুদ্রণের চেষ্টা করছি ।

তবে যখন আমি এটির stdoutমতো পুনঃনির্দেশ করি :

curl -v http://somehost/somepage > /dev/null

ফলাফলের কিছু ধরণের টেবিলটি আউটপুটটির মাঝখানে উপস্থিত হয় stderr:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

এর শেষে অনুসরণ করা:

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

যা প্রতিক্রিয়া শিরোনামগুলি কম পঠনযোগ্য করে তোলে।

পুনঃনির্দেশ না করার সময় আমি এই পাঠ্যটি দেখতে পাচ্ছি না।


প্রভাবগুলি দেখার আরও একটি উপায়:

সারণী প্রদর্শিত হবে না:

curl -v http://somehost/somepage 2>&1

সারণী প্রদর্শিত হবে:

curl -v http://somehost/somepage 2>&1 | cat

1) কীভাবে এটি কেবল নির্দিষ্ট ধরণের পুনঃনির্দেশগুলির সাথে প্রদর্শিত হয়?

2) এটিকে দমন করার সবচেয়ে উপায় কী?

ধন্যবাদ

উত্তর:


60

এটা চেষ্টা কর:

curl -vs -o /dev/null http://somehost/somepage 2>&1

এটি অগ্রগতি মিটারকে দমন করবে, প্রেরণ এবং প্রেরণ stdoutকরবে ( আউটপুট) এতে ।/dev/nullstderr-vstdout


32
ধন্যবাদ, -sকী ছিল!
ইয়ান ম্যাকিননন

6
@ ইয়ানম্যাকিনন নোট করুন যে এর সাথে -sকিন্তু ছাড়াও -vআপনি সংযোগ করতে ব্যর্থ হওয়ার মতো ত্রুটি দেখতে পাবেন না। এর জন্য আপনারও মোহাইদিসের উত্তরের মতো -S(বা --show-error) যোগ করা উচিত ।
আরটিওম

তবে কেন পুনঃনির্দেশের সময় অগ্রগতি বারটি কেবল প্রথম স্থানে উপস্থিত হয়? curlটু আউটপুট পাইপ করার সময় আমি এই একই সমস্যার মধ্যে দৌড়েছি jq। পাইপ ছাড়া কোনও অগ্রগতি বার নেই jq, তারপরে পাইপ দেওয়ার সময় jqআমাকে ফিরে যেতে হবে এবং যুক্ত করতে হবে -s
ষোলটিবিট

@ ষাট বিবিট: এটি একটি নকশা পছন্দ যা বিকাশকারীরা করেছেন। প্রোগ্রামটি STDOUTটিটিআইটি না হলে সনাক্ত করতে পারে । যখন আউটপুটটি পাইপ করা হচ্ছে না, আপনি অগ্রগতির তথ্যগুলি স্বাভাবিক আউটপুটের সাথে ছেদ করতে চান না, যা আপনি দেখতে এবং অগ্রগতির কিছু ধারণা রাখতে পারেন। যখন আউটপুট পুনঃনির্দেশিত বা পাইপ করা হয়, আপনি এটি দেখতে পাচ্ছেন না যাতে আপনার অগ্রগতির কোনও গেজ নেই - যতক্ষণ না অগ্রগতি বারটি চালু না হয়।
ডেনিস উইলিয়ামসন

23
curl --fail --silent --show-error http://www.example.com/ > /dev/null

এটি স্থিতি কথোপকথনটি দমন করবে তবে অন্যথায় এসটিডিআরআরতে ত্রুটিগুলি আউটপুট করবে।

user@host:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

পুনর্নির্দেশের সময় উপরেরগুলি স্থিতি সারণীকে আউটপুট করে।

user@host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

পুনর্নির্দেশের সময় উপরেরগুলি স্থিতি সারণীকে দমন করে তবে ত্রুটিগুলি এখনও এসটিডিআরআরে চলে যাবে।

user@host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve host 'www.errorexample.com'

উপরেরটি এসটিডিআরআর-এর ত্রুটির উদাহরণ।

user@host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@host:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'www.errorexample.com'

এসটিডিআরআরকে এসটিডিআউটে পুনঃনির্দেশ করার জন্য কেবল 2> এবং 1 টি যুক্ত করুন (এই ক্ষেত্রে, কোনও ফাইলে)।


5

মতে man curl:

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

ব্যবহারের উদাহরণ:

curl -s 'http://www.google.com'

বা যদি আপনি HTTP-BODY কে ব্যাশে ভেরিয়েবলের ক্যাপচার করতে চান

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

আপনি ব্যবহার করতে পারেন -sবা --silentবিনিময়যোগ্য।


4

প্রশ্ন 1 এর রেফারেন্সের সাথে ( সিআরএল কীভাবে কেবল টেবিলটি প্রদর্শন করতে পারে যখন আউটপুট পুনঃনির্দেশিত হয়), আমি বুঝতে পারি নি যে কোনও প্রোগ্রাম তার ফলাফলগুলি নির্দেশিত হতে পারে তা বলতে পারে, তবে এটি পসিক্স সিস্টেমে মনে হয় কোনও ফাংশন রয়েছে isattyযা রিপোর্ট করে কিনা একটি ফাইল বর্ণনাকারী একটি টার্মিনাল বোঝায়।


2
এখানে একটি বাশের স্নিপেট রয়েছে:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
ডেনিস উইলিয়ামসন

2

1) কীভাবে এটি কেবল নির্দিষ্ট ধরণের পুনঃনির্দেশগুলির সাথে প্রদর্শিত হয়?

কার্ল ম্যান পৃষ্ঠা থেকে

আপনি যদি এইচটিটিপি পোস্ট বা পুট অনুরোধগুলির জন্য একটি অগ্রগতি মিটার চান, আপনার শেল পুনর্নির্দেশ (>), -o [ফাইল] বা অনুরূপ ব্যবহার করে কোনও ফাইলের প্রতিক্রিয়া আউটপুট পুনর্নির্দেশ করতে হবে।

পুনর্নির্দেশ নির্ধারণ করার জন্য কার্লকে অবশ্যই ব্যবহার করতে হবে এবং কোনও ফাইল বা শেল পাইপে পুনর্নির্দেশের সময় অগ্রগতি মিটার প্রিন্ট করতে হবে।

2) এটিকে দমন করার সবচেয়ে উপায় কী?

কার্ল ম্যান পৃষ্ঠা থেকে

-স, - নিরব

নিরব বা শান্ত মোড। অগ্রগতি মিটার বা ত্রুটি বার্তা প্রদর্শন করবেন না। কার্ল নিঃশব্দ করে তোলে। এটি আপনি যে ডেটা চেয়েছিলেন তা এখনও আউটপুট দেবে, আপনি এটি পুনঃনির্দেশ না করা পর্যন্ত টার্মিনাল / স্টাডাউটেও সম্ভাব্য ally


1

সত্যিকারের ত্রুটি বার্তাগুলি অন্যদিকে রাখার জন্য, আপনার লগ ফাইলে স্ট্র্রার লিখতে হবে। এরকম কিছু:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null

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