ด้วยเหตุผลบางประการผลลัพธ์จะถูกพิมพ์ไปยังเทอร์มินัลเสมอไม่ว่าฉันจะเปลี่ยนเส้นทางผ่าน 2> หรือ> หรือ | มีวิธีแก้ปัญหานี้หรือไม่? เหตุใดจึงเกิดขึ้น
ด้วยเหตุผลบางประการผลลัพธ์จะถูกพิมพ์ไปยังเทอร์มินัลเสมอไม่ว่าฉันจะเปลี่ยนเส้นทางผ่าน 2> หรือ> หรือ | มีวิธีแก้ปัญหานี้หรือไม่? เหตุใดจึงเกิดขึ้น
คำตอบ:
เพิ่ม-s
ตัวเลือก (เงียบ) เพื่อลบตัววัดความคืบหน้าจากนั้นเปลี่ยนเส้นทาง stderr ไปยัง stdout เพื่อรับเอาต์พุต verbose บน fd เดียวกับเนื้อความตอบสนอง
curl -vs google.com 2>&1 | less
2>&1
ไป
URL ของคุณอาจมีเครื่องหมายแอมเพอร์แซนด์อยู่ ฉันมีปัญหานี้เช่นกันและฉันก็ตระหนักว่า URL ของฉันเต็มไปด้วยเครื่องหมายแอมเพอร์แซนด์ (จากตัวแปร CGI ที่ถูกส่งผ่าน) ดังนั้นทุกอย่างจึงถูกส่งไปที่พื้นหลังด้วยวิธีที่แปลกและทำให้เปลี่ยนเส้นทางไม่ถูกต้อง หากคุณใส่เครื่องหมายคำพูดไว้รอบ ๆ URL ก็จะแก้ไขได้
คำตอบข้างต้นไม่ได้ผลสำหรับฉันในที่สุดสิ่งที่ได้คือไวยากรณ์นี้:
curl https://${URL} &> /dev/stdout | tee -a ${LOG}
ทีวางเอาต์พุตบนหน้าจอ แต่ยังผนวกเข้ากับบันทึกของฉัน
&> /dev/stdout
เป็นส่วนที่ขาดหายไปอย่างแน่นอนขอบคุณ
ฉันพบสิ่งเดียวกัน: 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 เซ็นต์ของฉัน คำสั่งด้านล่างควรทำเคล็ดลับตามที่ตอบไว้ก่อนหน้านี้
curl -vs google.com 2>&1
อย่างไรก็ตามหากจำเป็นต้องรับผลลัพธ์เป็นไฟล์
curl -vs google.com > out.txt 2>&1
ควรทำงาน.
สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน:
ใส่คำสั่ง curl ของคุณในสคริปต์ชื่อ abc.sh
ตอนนี้เรียกใช้:
sh abc.sh 1>stdout_output 2>stderr_output
คุณจะได้รับผลการขดของคุณในและข้อมูลความคืบหน้าในstdout_output
stderr_output
ตัวอย่างง่ายๆนี้แสดงวิธีการจับเอาต์พุต curl และใช้ใน bash script
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
curl -v url 2>&1
นั้นข้อผิดพลาดจะถูกเปลี่ยนเส้นทางไปยังเอาต์พุตมาตรฐานสำหรับฉันอย่างถูกต้อง