ลำดับการเปลี่ยนเส้นทาง


29

ฉันไม่ค่อยเข้าใจว่าคอมพิวเตอร์อ่านคำสั่งนี้อย่างไร

cat file1 file2 1> file.txt 2>&1

หากฉันเข้าใจ2>&1เพียงแค่เปลี่ยนเส้นทางข้อผิดพลาดมาตรฐานไปที่เอาต์พุตมาตรฐาน

โดยตรรกะนั้นคำสั่งอ่านให้ฉันดังต่อไปนี้:

  1. ต่อไฟล์file1และfile2.

  2. ส่งจากการดำเนินการนี้stdoutfile.txt

  3. ส่งไปยังstderrstdout

  4. จบ?

ฉันไม่แน่ใจว่าคอมพิวเตอร์กำลังทำอะไรอยู่ โดยตรรกะของฉันคำสั่งควรจะเป็น

cat file1 file2 2>&1 > file.txt

แต่สิ่งนี้ไม่ถูกต้อง

คำตอบ:


46

ฉันคิดว่าใช้งานมอบหมายง่ายกว่า

  • > ก็เหมือน =
  • & ก็เหมือน $

คุณเริ่มต้นด้วย

1 = /dev/tty
2 = /dev/tty

ตัวอย่างแรกของคุณ1> file.txt 2>&1คือ

1 = file.txt
2 = $1           # and currently $1 = file.txt

ทิ้งคุณไว้กับ

1 = file.txt
2 = file.txt

หากคุณทำอย่างอื่นคุณเริ่มต้นอีกครั้ง

1 = /dev/tty
2 = /dev/tty

จากนั้นก็2>&1 > file.txtทำ

2 = $1           # and currently $1 = /dev/tty
1 = file.txt

ดังนั้นผลลัพธ์ที่ได้คือ

1 = file.txt
2 = /dev/tty

และคุณได้เปลี่ยนเส้นทางไปเพียงไม่stdoutstderr


ฉันได้รับการเปรียบเทียบ แต่มันสับสน - สิ่งที่จะ$ยืน?
Eliran Malka

ในการกำหนดเช่นvar=$othervar, $แนะนำชื่อตัวแปรทางด้านขวามือ ในการเปลี่ยนเส้นทางเหมือน2>&1, &แนะนำจำนวนไฟล์อธิบายทางด้านขวามือ ฉันกำลังบอกว่าคุณสามารถคิดได้เหมือน "ไฟล์ 2 เท่ากับไฟล์ 1" (แต่มีสองประเภทเท่ากับ: <หมายถึง "สำหรับการอ่าน" และ>หมายถึง "สำหรับการเขียน".)
มิเคล

12

ลำดับของการเปลี่ยนเส้นทางเป็นสิ่งสำคัญและพวกเขาควรจะอ่านจากซ้ายไปขวา

ตัวอย่างเช่น: command 2>&1 >somefileหมายถึง:

  1. เปลี่ยนเส้นทางstderr(คือ2) ไปยังปลายทางปัจจุบันของstdout(ณ จุดนี้เทอร์มินัล)
  2. จากนั้นเปลี่ยนstdoutไปsomefileใช้

ดังนั้นในกรณีนี้stderrไปที่เทอร์มินัลและstdoutไปที่ไฟล์ซึ่งไม่ใช่สิ่งที่คุณอาจต้องการ

ในทางกลับcommand >somefile 2>&1กันหมายถึง:

  1. เปลี่ยนเส้นทางstdoutไปที่somefile
  2. จากนั้นเปลี่ยนเส้นทางstderrไปยังปลายทางเดียวกันกับstdout( somefile)

ในกรณีนี้ทั้งคู่ stderrstdoutไปและไปsomefileซึ่งอาจเป็นสิ่งที่คุณต้องการ


4
cat file1 file2 1> file.txt 2>&1

>& จริงๆแล้วหมายถึงการทำซ้ำมันใช้การเรียกระบบซ้ำเพื่อแมปไฟล์ descriptor ใหม่ไปยังไฟล์ที่เปิดอยู่แล้ว

ดังนั้นคุณ (ทุบตีจริง) ก่อนอื่นต้องเปิด stdout ใหม่ก่อนโดยพูดว่า "และเปลี่ยนเส้นทาง stderr ไปยัง stdout ใดก็ตามที่ตั้งค่าไว้ในขณะนี้"


นี่มันเจ๋งมาก! &ฉันรับการสงสัยเกี่ยวกับว่า คุณสามารถใส่การอ้างอิงบางส่วนกับไวยากรณ์นั้นหรือ - ดีกว่า - แหล่งข้อมูลที่ดีบางอย่างในระบบดูอัลดังกล่าวข้างต้น?
Eliran Malka

1
'man dup' จัดทำเอกสารการเรียกระบบ
X Tian

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