Dash เทียบเท่ากับการเปลี่ยนเส้นทางของสคริปต์เอาต์พุต


9

ใน Bash คุณสามารถเปลี่ยนทิศทางเอาต์พุต stdout ในอนาคตทั้งหมดของสคริปต์ที่รันอยู่ในปัจจุบัน ตัวอย่างเช่นกับสคริปต์นี้

exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3

สิ่งนี้จะจบลงใน syslog:

Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3

แต่นี่เป็นข้อมูลเฉพาะของ Bash และการดำเนินการเปลือยกายด้วยการเปลี่ยนเส้นทางดูเหมือนจะไม่ทำงานใน Dash

Syntax error: redirection unexpected

ฉันจะทำให้มันทำงานใน Dash หรืออาจเป็นได้ทั้งใน shells?


คุณช่วยอธิบายสิ่งที่คุณต้องการได้อย่างแน่นอน คุณสามารถเปลี่ยนเส้นทางด้วย>ในประ ฉันรู้ว่าคุณดูเหมือนจะขออย่างอื่น แต่ฉันไม่สามารถบอกได้ว่ามันคืออะไร
terdon

@terdon ฉันได้ขยายคำอธิบาย
Alex B

คำตอบ:


6

คุณสามารถทำได้:

{ commands
....
} | logger -t my_awesome_script

คุณสามารถทำสิ่งนั้นกับเชลล์ได้

หากคุณไม่ชอบหน้าตามันอาจจะทำให้สคริปต์ห่อหุ้มตัวเองในฟังก์ชั่น

#!/bin/sh
run() if     [ "$run" != "$$" ] || return
      then   sh -c 'run=$$ exec "$0" "$@"' "$0" "$@" |
             logger -t my-awesome-script
      fi
#script-body
run "$@" || do stuff

บรรทัดสุดท้ายนั้นควรเป็นrun ${1+"$@"} || do stuffเพื่อให้อาร์กิวเมนต์คงอยู่
Adam Katz

@ AdamKatz - จุดดีผู้บริหาร${1+"$@"}ไม่ทำอะไร"$@" เลย มันมีปัญหาอื่น ๆ อยู่ดี
mikeserv

"$@"จะผ่าน""เมื่อไม่มีข้อโต้แย้งในขณะที่${1+"$@"}จะผ่านสตริงว่างเมื่อไม่มีข้อโต้แย้ง เรื่องนี้มีความสำคัญอย่างมากสำหรับหลาย ๆ โปรแกรมเพราะพวกเขาแยก""เป็นอาร์กิวเมนต์ว่างเปล่าในขณะที่สตริงว่าง (ไม่ระบุ) จะไม่ถูกตีความว่าเป็นอาร์กิวเมนต์เลย
Adam Katz

@ AdamKatz - เชลล์ Bourne ที่เก่าแก่มากอาจ(และฉันคาดหวังว่าจะพบdashในระบบดังกล่าว)แต่"$@"เป็นอย่างอื่นที่ไม่ซ้ำกันในกรณีที่ zero-args case ไม่ได้แทนที่อาร์กิวเมนต์ null สำหรับเชลล์ POSIX
mikeserv

1
@ AdamKatz - มันเป็นข้อผิดพลาดจริง ๆ แม้ใน bsh เก่าและไม่ควรทำงานแบบนั้น มันได้รับการแก้ไขในที่สุด แต่ฉันก็ไม่รู้ว่ามันควรจะมีความจำเป็นใน Solaris 10 หรือไม่ youre ขวาประมาณ $ * - มันไม่ได้แสดงคุณสมบัติที่เรียบร้อยเดียวกันของ expabsion - เกี่ยวข้อง onky เอกลักษณ์กับเนื้อหาตัวแปรของการขยายตัวของมันแม้ว่ามันจะเป็น something.in "${@+is especially cool $@}" ความคิดของฉัน แต่ไม่แตกต่างจาก${1+”$@"}วิธีแก้ปัญหาแบบเดิมมากนัก หากคุณมี ksh93:"${1+quoted" not quoted "quoted again}"
mikeserv

5

การทดแทนกระบวนการสามารถจำลองได้ง่ายด้วยท่อที่มีชื่อ

mkfifo logger_input
logger -t my_awesome_script < logger_input &
exec > logger_input
echo 1
echo 2
echo 3

ในความเป็นจริงชื่อท่อเป็นหนึ่งในกลไก (ถูกอื่น ๆ/dev/fd) bashซึ่งเปลี่ยนตัวกระบวนการสามารถดำเนินการใน


ความคิดที่หลากหลายที่สุดในความคิดของฉัน: ฉันสามารถใช้ทีออฟเพื่อเปลี่ยนเส้นทางไปยังสตรีมจำนวนมากได้อย่างราบรื่น สิ่งหนึ่งที่: อย่าลืมลบ logger_input ที่สร้างขึ้นในตอนท้ายของสคริปต์
lauhub

2

ฉันไม่คิดว่ามันเป็นไปได้dashค่ะ เท่าที่ฉันสามารถบอกได้จากmanหน้าเว็บมันไม่สนับสนุนการทดแทนกระบวนการ

คุณสามารถลองใช้สิ่งที่mikserv แนะนำหรือคุณสามารถเปลี่ยนเส้นทางทุกอย่างไปยังไฟล์จากนั้นหลังจากสคริปต์ของคุณเสร็จสิ้น (สมมุติว่านี่เป็นสคริปต์) เพิ่มเนื้อหาของไฟล์ลงในตัวบันทึก:

$ exec > ~/foo/foo.txt
$ ls
$ echo something
$ cat foo/foo.txt | sudo logger -t my-awesome-script

อันที่จริงแล้วการทดแทนโปรเซส - หรือเชลล์อื่นใดเรียกการทดแทนโปรเซส - ในdashเชลล์นั้นง่ายกว่า การทดแทนโปรเซสนั้นเท่ากับอาร์กิวเมนต์ที่ชี้ไปยัง/dev/fd/[num]ลิงก์ไปยังไพพ์นิรนาม dashทำที่นี่ - เอกสารที่มีท่อที่ไม่ระบุชื่อมากกว่าการสร้างไฟล์ temp เช่นเดียวกับเปลือกหอยส่วนใหญ่ทำ ดังนั้นcat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\nไม่เพียง แต่เทียบเท่ากับการใช้งานได้คุณยังสามารถตั้งชื่อ fd ด้วยตัวคุณเอง ถึงกระนั้นประเด็นของคุณก็ถูกสร้างขึ้นมาอย่างดีเกี่ยวกับการไปในทางอื่น - คุณต้องเปิด fd ใหม่ด้วยexecและทำกระบวนการที่อ่าน
mikeserv

2
@mikeserv: ในความหมายอะไรcat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n"ง่าย" กว่าcat <(get output)?
ruakh

@mikeserv: มันเกี่ยวข้องกับกฎมากมายที่ต้องจำ บางทีคุณอาจเคยชินกับสิ่งที่คุณไม่สังเกตเห็น
ruakh

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

1
@mikeserv: ไม่ใช่แค่ heredocs แต่ยัง/dev/fd/3(ในรูปแบบที่แม่นยำ) และรายละเอียดของสิ่งที่เกิดขึ้นกับช่องว่าง . . และสำหรับเรื่องนั้นความจริงที่ว่าวิธีการทั้งหมดนี้ใช้งานได้ทั้งหมดใน Dash เมื่อมันไม่ทำงานในเชลล์อื่น ๆ ที่มีส่วนประกอบทั้งหมดหมายความว่าวิธีการโดยรวมนั้นเป็นกฎพิเศษที่ต้องจดจำ (สิ่งนี้ทำให้ฉันนึกถึงความพยายามในการสร้างภาษาอังกฤษที่ง่ายขึ้นโดยใช้คำศัพท์น้อยกว่าพวกเขาตัดคำเช่นยังคงอยู่แต่พวกเขาไม่สนใจสำนวนที่ยากลำบากเช่นยากที่จะทำต่อไป)
ruakh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.