ฉันจะไปป์หรือเปลี่ยนทิศทางเอาต์พุตของ curl -v ได้อย่างไร


117

ด้วยเหตุผลบางประการผลลัพธ์จะถูกพิมพ์ไปยังเทอร์มินัลเสมอไม่ว่าฉันจะเปลี่ยนเส้นทางผ่าน 2> หรือ> หรือ | มีวิธีแก้ปัญหานี้หรือไม่? เหตุใดจึงเกิดขึ้น


3
ถ้าฉันทำเช่นcurl -v url 2>&1นั้นข้อผิดพลาดจะถูกเปลี่ยนเส้นทางไปยังเอาต์พุตมาตรฐานสำหรับฉันอย่างถูกต้อง
Josh Lee

คำตอบ:


134

เพิ่ม-sตัวเลือก (เงียบ) เพื่อลบตัววัดความคืบหน้าจากนั้นเปลี่ยนเส้นทาง stderr ไปยัง stdout เพื่อรับเอาต์พุต verbose บน fd เดียวกับเนื้อความตอบสนอง

curl -vs google.com 2>&1 | less

3
สิ่งนี้ใช้ได้กับเว็บไซต์ส่วนใหญ่ แต่ด้วยเหตุผลบางประการเซิร์ฟเวอร์ภายในเครื่องของฉันยังคงพิมพ์เอาต์พุตแบบเต็มแม้ว่าฉันจะทำ `2> & 1 | grep asdfasdfasdfasdfdfs` หรือบางสิ่งเช่นนั้น เอาต์พุตแบบเต็มรวมถึงส่วนหัวยังคงแสดงอยู่บนคอนโซล มีสตรีมอื่นที่ฉันสามารถไพพ์เป็น grep เพื่อดึงข้อมูลบางอย่างที่ฉันต้องการได้หรือไม่?
jonderry

คุณพยายามดึงข้อมูลอะไรออกมาและข้อมูลใดที่คุณต้องการทิ้งไป ฉันเข้าใจคำถามของคุณหมายความว่าคุณต้องการให้ผลลัพธ์ของ -v ทั้งหมดถูกส่งไปยัง stdout
SingleNegationElimination

ฉันต้องการประมวลผลคุกกี้บางส่วน (โดยทั่วไปจะดึงข้อมูลบางอย่างจากคุกกี้และทำสิ่งอื่น ๆ ) ใช่ฉันต้องการให้ทุกอย่างเป็นไปตามมาตรฐานดังนั้นฉันจึงสามารถประมวลผลสิ่งที่ต้องการผ่านทางท่อ ขณะนี้เอาต์พุตบางส่วนแสดงบนคอนโซลและดูเหมือนจะไม่สามารถเปลี่ยนเส้นทางได้และฉันไม่แน่ใจว่าทำไม
jonderry

คุณสามารถโพสต์ภาพหน้าจอของผลลัพธ์ที่ปรากฏบนหน้าจอที่คุณต้องการจับภาพได้หรือไม่? ฉันไม่รู้ว่าคุณจะเห็นผลลัพธ์แบบไหนที่อาจพลาด2>&1ไป
SingleNegationElimination

เป็นเพียงผลลัพธ์ประเภทเดียวกับเว็บไซต์อื่น ๆ ข้อแตกต่างเพียงอย่างเดียวคือเซิร์ฟเวอร์กำลังทำงานภายในเครื่อง มีวิธีใดบ้างที่โปรแกรมใด ๆ จะพิมพ์ไปยังคอนโซล แต่ไม่มีข้อความนั้นถูกจับโดย stout / sterr?
jonderry

115

URL ของคุณอาจมีเครื่องหมายแอมเพอร์แซนด์อยู่ ฉันมีปัญหานี้เช่นกันและฉันก็ตระหนักว่า URL ของฉันเต็มไปด้วยเครื่องหมายแอมเพอร์แซนด์ (จากตัวแปร CGI ที่ถูกส่งผ่าน) ดังนั้นทุกอย่างจึงถูกส่งไปที่พื้นหลังด้วยวิธีที่แปลกและทำให้เปลี่ยนเส้นทางไม่ถูกต้อง หากคุณใส่เครื่องหมายคำพูดไว้รอบ ๆ URL ก็จะแก้ไขได้


1
ผมมีปัญหาเหมือนกัน. ไม่จำเป็นต้องใช้ 2> & 1 ดังนั้นฉันจึงสามารถแยกเอาต์พุตและบันทึกการเชื่อมต่อแยกกันได้ ขอบคุณ roadnottaken
quornian

3
Love Stack-O ... ฉันพบ q นี้และการกล่าวถึงเครื่องหมายแอมเปอร์แซนด์ใน URL ใส่คำพูดรอบตัวฉันและแก้ไขปัญหาได้
Paulb

2
คำพูดเป็นเคล็ดลับสำหรับฉัน ฉันรู้สึกเหมือนกำลังดำเนินการ curl ในเธรดอื่น ๆ ขอบคุณมาก !
vdolez

1
ต้องค้นหาบนเว็บห้านาทีก่อนที่คุณจะบันทึกตอนเย็นของฉัน :)
Shautieh

พระเยซูช่างเป็นข้อบกพร่องที่น่ากลัวในการขดตัว - อย่างน้อยที่สุดก็ควรล้มเหลวหรือให้คำเตือน คำตอบในปี 2012 ของคุณช่วยฉันในปี 2018 ใช้เวลาฉัน 30 นาทีในการแก้ปัญหานี้จนกว่าฉันจะพบคำตอบของคุณ ขอบคุณ!
Mauvis Ledford

29

คำตอบข้างต้นไม่ได้ผลสำหรับฉันในที่สุดสิ่งที่ได้คือไวยากรณ์นี้:

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

ทีวางเอาต์พุตบนหน้าจอ แต่ยังผนวกเข้ากับบันทึกของฉัน


1
&> /dev/stdoutเป็นส่วนที่ขาดหายไปอย่างแน่นอนขอบคุณ
mattspain

10

หากคุณต้องการผลลัพธ์ในไฟล์คุณสามารถใช้การเปลี่ยนเส้นทาง:

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

โปรดแน่ใจว่าจะไม่พลิก>curl-output.txtและ2>&1ซึ่งจะไม่ทำงานเนื่องจากพฤติกรรมการเปลี่ยนเส้นทางของทุบตี


3

ฉันพบสิ่งเดียวกัน: curl ด้วยตัวเองจะพิมพ์เป็น STDOUT แต่ไม่สามารถส่งไปยังโปรแกรมอื่นได้

ตอนแรกฉันคิดว่าฉันได้แก้ไขแล้วโดยใช้ xargs เพื่อสะท้อนผลลัพธ์ก่อน:

curl -s ... <url> | xargs -0 echo | ...

แต่ตามที่ระบุไว้ในความคิดเห็นมันยังใช้งานได้โดยไม่มีส่วน xargs ดังนั้น-s(โหมดเงียบ) จึงเป็นกุญแจสำคัญในการป้องกันเอาต์พุตความคืบหน้าภายนอกไปยัง STDOUT:

curl -s ... <url> | perl  -ne 'print $1 if /<sometag>([^<]+)/'

ตัวอย่างข้างต้นใช้<sometag>เนื้อหาอย่างง่าย(ไม่มีแท็กฝังตัว) จากเอาต์พุต XML ของคำสั่ง curl


2
ในตัวอย่างของคุณ 'xargs -0 echo |' ไม่จำเป็น ตราบเท่าที่คุณมี "curl -s" คุณสามารถไพพ์เอาต์พุตไปยังโปรแกรมอื่นได้
Ryan Horrisberger

1

แค่ 2 เซ็นต์ของฉัน คำสั่งด้านล่างควรทำเคล็ดลับตามที่ตอบไว้ก่อนหน้านี้

curl -vs google.com 2>&1

อย่างไรก็ตามหากจำเป็นต้องรับผลลัพธ์เป็นไฟล์

curl -vs google.com > out.txt 2>&1

ควรทำงาน.


1
สิ่งนี้ไม่ได้เพิ่มมูลค่าที่แท้จริงให้กับคำตอบที่ยอมรับของปี 2011 หากมีสิ่งใดสิ่งนี้อาจเป็นข้อคิดเห็นสำหรับคำตอบนั้น
trincot

0

สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน:

ใส่คำสั่ง curl ของคุณในสคริปต์ชื่อ abc.sh

ตอนนี้เรียกใช้:

sh abc.sh 1>stdout_output 2>stderr_output

คุณจะได้รับผลการขดของคุณในและข้อมูลความคืบหน้าในstdout_outputstderr_output


0

ตัวอย่างง่ายๆนี้แสดงวิธีการจับเอาต์พุต curl และใช้ใน bash script

test.sh

function main
{
  \curl -vs 'http://google.com'  2>&1
  # note: add -o /tmp/ignore.png if you want to ignore binary output, by saving it to a file. 
}

# capture output of curl to a variable
OUT=$(main)

# search output for something using grep.
echo
echo "$OUT" | grep 302 
echo
echo "$OUT" | grep title 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.