cURL: จะระงับเอาต์พุตที่แปลกเมื่อเปลี่ยนเส้นทางได้อย่างไร


66

ฉันพยายามพิมพ์เฉพาะส่วน verbose ของคำร้องขอ cURL (ซึ่งถูกส่งไปstderr) จาก bash shell

แต่เมื่อฉันเปลี่ยนเส้นทาง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) วิธีปราบปรามที่ประณีตที่สุดคืออะไร?

ขอขอบคุณ

คำตอบ:


59

ลองสิ่งนี้:

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

ที่จะปราบปรามเมตรความคืบหน้าส่งstdoutไป/dev/nullและเปลี่ยนstderr(คน-vเอาท์พุท) stdoutเพื่อ


32
ขอบคุณ-sเป็นกุญแจสำคัญ!
Ian Mackinnon

6
@IanMackinnon โปรดทราบว่าหากมี-sแต่ไม่มี-vคุณจะไม่เห็นข้อผิดพลาดเช่นความล้มเหลวในการเชื่อมต่อ เพื่อที่คุณควรเพิ่ม-S(หรือ--show-error) ในคำตอบของ mhoydis
Artyom

แต่ทำไมแถบความคืบหน้าปรากฎในที่แรกเมื่อเปลี่ยนเส้นทาง? ฉันวิ่งเข้าไปในปัญหาเดียวกันนี้เมื่อท่อส่งออกของไปcurl jqไม่มีแถบความคืบหน้าโดยไม่ต้องท่อไปjqแล้วเมื่อท่อไปผมต้องกลับไปและเพิ่มjq -s
sixty4bit

@ sixty4bit: นั่นเป็นตัวเลือกการออกแบบที่นักพัฒนาสร้างขึ้นมา โปรแกรมสามารถตรวจจับได้เมื่อSTDOUTไม่ใช่ tty เมื่อไม่มีการไพพ์เอาต์พุตคุณไม่ต้องการให้ข้อมูลความคืบหน้าสลับกับเอาท์พุตปกติซึ่งคุณสามารถเห็นและมีแนวคิดเกี่ยวกับความคืบหน้า เมื่อเอาต์พุตถูกเปลี่ยนเส้นทางหรือไพพ์คุณจะไม่เห็นดังนั้นคุณจึงไม่มีเกจสำหรับความคืบหน้า - ยกเว้นว่าแถบความคืบหน้าเปิดอยู่
Dennis Williamson

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

สิ่งนี้จะไม่แสดงไดอะล็อกสถานะ แต่จะส่งเอาต์พุตข้อผิดพลาดไปที่ STDERR

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

ด้านบนไม่แสดงตารางสถานะขณะเปลี่ยนเส้นทาง แต่ข้อผิดพลาดจะยังคงอยู่ที่ STDERR

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

ด้านบนเป็นตัวอย่างของข้อผิดพลาดกับ STDERR

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 ที่ส่วนท้ายเพื่อเปลี่ยนเส้นทาง STDERR ไปยัง STDOUT (ในกรณีนี้คือไฟล์)


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 ( วิธีม้วนรู้เพื่อแสดงเฉพาะตารางเมื่อมีการเปลี่ยนเส้นทางการส่งออก) ฉันไม่ได้ตระหนักถึงโปรแกรมที่สามารถบอกได้ว่าผลของมันถูกกำกับ แต่ดูเหมือนว่าในระบบ POSIX มีฟังก์ชั่นisattyซึ่งรายงานหรือไม่ว่า file descriptor อ้างถึงเทอร์มินัล


2
นี่เป็นตัวอย่างข้อมูล Bash:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
Dennis Williamson

2

1) เหตุใดจึงแสดงเฉพาะการเปลี่ยนเส้นทางบางประเภท

จากหน้าคนขด

หากคุณต้องการตัววัดความคืบหน้าสำหรับการร้องขอ HTTP POST หรือ PUT คุณต้องเปลี่ยนเส้นทางการตอบกลับไปยังไฟล์โดยใช้การเปลี่ยนเส้นทางเชลล์ (>), -o [ไฟล์] หรือคล้ายกัน

curl ต้องใช้isattyเพื่อกำหนดการเปลี่ยนเส้นทางและพิมพ์มาตรวัดความคืบหน้าเมื่อเปลี่ยนเส้นทางไปยังไฟล์หรือเชลล์ไพพ์

2) วิธีปราบปรามที่ประณีตที่สุดคืออะไร?

จากหน้าคนขด

-s, - เงียบสงบ

โหมดเงียบหรือเงียบ อย่าแสดงตัววัดความคืบหน้าหรือข้อความแสดงข้อผิดพลาด ทำให้ Curl ปิดเสียง มันจะยังคงเอาท์พุทข้อมูลที่คุณร้องขอแม้กระทั่งกับเทอร์มินัล / stdout เว้นแต่คุณจะเปลี่ยนเส้นทาง


1

ในการใส่ข้อความแสดงข้อผิดพลาดจริงที่ใดที่หนึ่งคุณควรเขียน strerr ลงในไฟล์บันทึก อะไรแบบนั้น:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.