ฉันรู้ว่ามีการ>
ใช้เครื่องหมายสำหรับการเปลี่ยนเส้นทางเอาต์พุตในบรรทัดคำสั่ง แต่ฉันมีปัญหาในการค้นหาสิ่งที่อธิบายการใช้2>&1
ในบรรทัดคำสั่ง ตัวอย่างเช่น:
curl http://www.google.com > /dev/null 2>&1 &
ฉันรู้ว่ามีการ>
ใช้เครื่องหมายสำหรับการเปลี่ยนเส้นทางเอาต์พุตในบรรทัดคำสั่ง แต่ฉันมีปัญหาในการค้นหาสิ่งที่อธิบายการใช้2>&1
ในบรรทัดคำสั่ง ตัวอย่างเช่น:
curl http://www.google.com > /dev/null 2>&1 &
คำตอบ:
1
หมายถึงการส่งออกมาตรฐาน (stdout) 2
หมายถึงข้อผิดพลาดมาตรฐาน (stderr)
ดังนั้น2>&1
บอกว่าจะส่งข้อผิดพลาดมาตรฐานไปยังที่ที่เคยส่งออกมาตรฐานจะถูกเปลี่ยนเส้นทางเช่นกัน ซึ่งเนื่องจากมันถูกส่งไป/dev/null
เป็นคล้ายกับละเว้นผลลัพธ์ใด ๆ เลย
0
(stdin), 1
(stdout) และ2
(stderr) เป็นตัวให้คำอธิบายไฟล์จริง ๆ เชลล์จำเป็นต้องมีเครื่องหมายและใส่ไว้ข้างหน้าเพื่อเปลี่ยนเส้นทาง มันทำซ้ำไฟล์ descriptor ในกรณีนี้อย่างมีประสิทธิภาพรวมสองกระแสข้อมูลเข้าด้วยกัน
curl http://www.google.com 2>/dev/null
บรรทัดคำสั่งรู้ได้อย่างไรว่า "2" ที่นี่มีวัตถุประสงค์เพื่อหมายถึง stderr และไม่ใช่พารามิเตอร์ที่สองที่ฉันส่งไปยังคำสั่ง curl
stderr
ตรงไปยัง/dev/null
แทน คุณสามารถดูได้ในทางปฏิบัติโดยพยายามcurl
, curl 1>/dev/null
และcurl 2>/dev/null
เพียงเพื่อให้เห็นการเปลี่ยนแปลงที่ส่งออก เครื่องหมายแอมเปอร์แซนด์อีกครั้งจำเป็นสำหรับไฟล์ descriptor ที่จะถูกเปลี่ยนเส้นทางไปเท่านั้น
การดึงข้อมูลhttp://www.google.com
ในพื้นหลังและทิ้งทั้งสองและstdout
stderr
curl http://www.google.com > /dev/null 2>&1 &
เป็นเช่นเดียวกับ
curl http://www.google.com > /dev/null 2>/dev/null &
0
, 1
และ2
เป็นตัวแทนของไฟล์มาตรฐานอธิบายในPOSIXระบบปฏิบัติการ บ่งแฟ้มคือการอ้างอิงระบบ (พื้น) ไฟล์หรือซ็อกเก็ต
การสร้างไฟล์ descriptor ใหม่ใน C สามารถมีลักษณะดังนี้:
fd = open("data.dat", O_RDONLY)
คำสั่งระบบ Unix ส่วนใหญ่รับอินพุตและเอาต์พุตผลลัพธ์ไปยังเทอร์มินัล curl
จะเรียกสิ่งที่อยู่ใน URL ที่ระบุ ( google ดอทคอม ) stdout
และแสดงผลให้
เหมือนที่คุณพูด<
และ>
ใช้เพื่อเปลี่ยนเส้นทางเอาต์พุตจากคำสั่งไปยังที่อื่นเช่นไฟล์
ยกตัวอย่างเช่นในls > myfiles.txt
, ls
ได้รับเนื้อหาไดเรกทอรีปัจจุบันและ>
เปลี่ยนเส้นทางการส่งออกไปยังmyfiles.txt
(ถ้าไฟล์ไม่อยู่มันถูกสร้างขึ้นทับอย่างอื่น แต่คุณสามารถใช้>>
แทนการ>
ที่จะผนวกไปยังแฟ้มแทน) หากคุณเรียกใช้คำสั่งด้านบนคุณจะสังเกตเห็นว่าไม่มีสิ่งใดปรากฏขึ้นที่เครื่อง ซึ่งมักหมายถึงความสำเร็จในระบบ Unix เพื่อตรวจสอบสิ่งนี้cat myfiles.txt
เพื่อแสดงเนื้อหาของไฟล์ไปที่หน้าจอ
ส่วนแรก> /dev/null
เปลี่ยนเส้นทางของstdout
ที่curl
ส่งออกไปยัง/dev/null
(เพิ่มเติมในข้างหน้านี้) และ2>&1
เปลี่ยนเส้นทางstderr
ไปที่stdout
(ซึ่งเพิ่งถูกเปลี่ยนเส้นทางไป/dev/null
เพื่อให้ทุกอย่างจะถูกส่งไป/dev/null
)
ด้านซ้ายของ2>&1
จะบอกสิ่งที่จะเปลี่ยนเส้นทางและทางด้านขวาจะบอกคุณว่าจะไปที่ใด &
ถูกนำมาใช้ในด้านสิทธิที่จะแยกแยะความแตกต่างstdout (1)
หรือstderr (2)
จากไฟล์ชื่อหรือ1
2
ดังนั้นใน2>1
ที่สุดการสร้างไฟล์ใหม่ (หากยังไม่มีอยู่) จะมีชื่อ1
และถ่ายโอนข้อมูลstderr
ผลลัพธ์ในนั้น
/dev/null
เป็นไฟล์ว่างเปล่ากลไกที่ใช้ในการทิ้งทุกอย่างที่เขียนลงไป ดังนั้น
curl http://www.google.com > /dev/null
การปราบปรามcurl
ผลลัพธ์ของ
แต่ทำไมถึงมีบางสิ่งยังคงปรากฏบนเครื่อง? นี่คือไม่ได้ curl
's ส่งออกปกติ แต่ข้อมูลที่ส่งไปstderr
ใช้ที่นี่เพื่อแสดงความคืบหน้าและข้อมูลการวินิจฉัยและไม่เพียง แต่ข้อผิดพลาด
curl http://www.google.com > /dev/null 2>&1
จะไม่สนใจข้อมูลcurl
ผลลัพธ์และcurl
ความคืบหน้าของทั้งคู่ ผลลัพธ์ก็คือไม่มีสิ่งใดปรากฏขึ้นบนเครื่อง
&
ที่สิ้นสุดเป็นวิธีที่คุณบอกเปลือกเพื่อเรียกใช้คำสั่งเป็นงานในพื้นหลัง สิ่งนี้ทำให้พรอมต์ให้กลับมาทันทีในขณะที่คำสั่งรันแบบอะซิงโครนัสเบื้องหลัง หากต้องการดูประเภทงานปัจจุบันjobs
ในเทอร์มินัลของคุณ หมายเหตุนี่แตกต่างจากกระบวนการที่ทำงานในระบบของคุณ หากต้องการดูประเภทเหล่านั้นtop
ในเทอร์มินัล
/dev/null
หรือไม่ คุณไม่ต้องการผลลัพธ์curl
อย่างน้อยมีประโยชน์หรือไม่?
2
หมายถึง STDERR 2>&1
จะส่ง STDERR ไปยังตำแหน่งเดียวกับ1
(STDOUT)
ฉันเข้าใจดังต่อไปนี้:
หากคุณต้องการอ่านข้อมูลเอาต์พุตและข้อผิดพลาดของคำสั่งบนหน้าจอให้เขียนเพียง:
curl http://www.google.com
และบางครั้งคุณต้องการบันทึกข้อมูลเอาต์พุตเป็นไฟล์แทนที่จะเป็นหน้าจอเทอร์มินัลเพื่อตรวจสอบในภายหลังจากนั้นคุณสามารถเขียน:
curl http://www.google.com > logfile
แต่ด้วยวิธีนี้ข้อมูล StdErr จะถูกละเว้นเนื่องจาก>
เปลี่ยนเส้นทาง StdOut ไปlogfile
เท่านั้น
ดังนั้นหากคุณสนใจข้อมูลข้อผิดพลาดของคำสั่งเมื่อล้มเหลวในการดำเนินการคุณจะต้องรวม StdOut กับ StdErr โดยใช้2>&1
(ซึ่งหมายถึงการพับ StdErr เป็น StdOut) ดังนั้นบรรทัดคำสั่งต่อไปนี้สามารถเขียนได้:
curl http://www.google.com > logfile
2> & 1