ความหมายของการเปลี่ยนเส้นทาง '2>> (คำสั่ง)' ใน Bash


18

ไม่นานมานี้ฉันสร้างสคริปต์และฉันเพิ่มการบันทึกรอบ ๆ มัน แต่ฉันลืมว่าการเปลี่ยนเส้นทางสำหรับการบันทึกทำงานอย่างไร :-(

ส่วนสำคัญของมันคือ:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

เมื่อฉันเรียกใช้สคริปต์ก็ไม่ได้พิมพ์อะไรไปแต่เพียงพิมพ์สิ่งที่จะไปstdout stderrLogfile ${LOGFILE}จับทั้ง stdout และ stderr

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

ส่วนของการเปลี่ยนเส้นทางที่ตอนนี้ไขปริศนาให้ฉันคือไวยากรณ์ของ: 2> >( some command )

ใครสามารถอธิบายสิ่งที่เกิดขึ้นที่นั่น?

คำตอบ:


23

>(...)เรียกว่าขั้นตอนการเปลี่ยนตัว มันอนุญาตให้โปรแกรม "outer" เขียนไปยังโปรแกรม "inner" ราวกับว่าเป็นไฟล์

ในกรณีนี้ก็เขียนstderrไปtee -a ${LOGFILE} >&2ซึ่งจะผนวกกับแล้วยังเขียนทุกอย่างกลับไปLOGFILEstderr

ตัวดำเนินการเปลี่ยนเส้นทางสามารถไปในทิศทางใดทิศทางหนึ่งสำหรับการทดแทนกระบวนการดังนั้นคุณสามารถเขียนถึงมันได้ในตัวอย่างนี้หรือใช้<(...)เพื่ออ่านจากมันซึ่งเป็นวิธีที่สะดวกในการทำwhileลูปโดยไม่ต้องรันมันใน subshell ตัวเอง


5
ได้มัน :-) ถ้าผมดำเนินการจะช่วยให้ฉันชื่อของแฟ้มแทนไปนี้:echo <(date) /dev/fd/63ถ้าผมดำเนินการจะช่วยให้ฉันวันคือเนื้อหาของไฟล์แทนไปนี้:cat <(date) Fri Nov 18 14:11:09 NZDT 2016
NZD

@NZD ใช่ - แต่อย่าคิดว่ามันเป็นไฟล์ปกติ - สิ่งที่คุณเห็น/devคือชื่อของไพพ์ระหว่างกระบวนการ
Toby Speight

มีการใช้เทคนิคนี้หรือไม่เนื่องจาก stderr ไม่สามารถไพพ์ได้ (ถึงteeในกรณีนี้)?
bli

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