Linux / Debian - 'pee' ใน moreutils ทำอะไรได้บ้าง


21

ฉันเพิ่งค้นพบแพคเกจ 'moreutils ใน Debian (และ Ubuntu) มันเป็นชุดของเครื่องมือยูนิกซ์ที่สะดวก

หนึ่งในคำสั่งคือ 'pee' หน้าคนพูดว่า:

ฉี่เป็นเหมือนที แต่สำหรับท่อ

อย่างไรก็ตามมันเป็นหน้าสั้น ๆฉันได้ยื่นบั๊กแล้ว ไม่มีใครรู้ว่ามันทำอะไรวิธีการใช้ทำไมจะใช้มันได้หรือไม่

คำตอบ:


29

นี่คือสิ่งที่คุณสามารถทำได้กับพี่:

seq 5 -1 1 > file
cat file |pee 'sort -u > sorted' 'sort -R > unsorted'

ดังนั้นฉี่ทำงานกับเชลล์ท่อแทนไฟล์

ทุบตีไม่จำเป็นต้องฉี่ก็สามารถเปิดคำสั่งเปลือกเป็นไฟล์:

cat file |tee >(sort -u > sorted) >(sort -R > unsorted)

1
สิ่งนี้จะใช้ได้กับ jockers ชื่อไฟล์หรือไม่ ดูzgp.org/~dmarti/tips/git-multiple-post-receive-hooks - pee ใช้ในการคูณstdinและให้โคลนนิ่งสำหรับสคริปต์ทางคณิตศาสตร์ทุกรูปแบบชื่อไฟล์สามารถทุบตีบริสุทธิ์ได้หรือไม่ AFAIU มันจะขยายเครื่องหมายดอกจันภายในวงเล็บทำให้สิ่งtee >(app1 app2 app3 app4)ที่ไม่เหมือน>(app1) >(app2) >(app3) >(app4)ที่คำตอบของคุณแสดง
Arioch 'The

@Arioch ไวยากรณ์ bash จะไม่ทำงานกับเทคนิค hooks-joker เพียงติดตั้งโปรแกรมเพิ่มเติม
Tobu

1
ใช้tee >/dev/nullเพื่อหลีกเลี่ยงการจำลอง stdin เป็น stdout
jfs

1
ข้อได้เปรียบที่แท้จริงในการฉี่ข้ามทีคือมันส่ง stdout จากแต่ละกระบวนการย่อยไปยัง stdout ของ pee เอง ด้วย tee คุณต้องเปลี่ยนเส้นทางแต่ละกระบวนการ stdout เป็นไฟล์ถ้าคุณต้องการบันทึก แต่ด้วย pee คุณเพียงแค่ต้องบันทึก stdout แน่นอนว่าเหมาะสมกว่าหากคำสั่งย่อยแต่ละคำสั่งแสดงผลลัพธ์ในรูปแบบที่คล้ายกัน เช่นถ้าคุณไม่สามารถหาวิธีหรือนิพจน์ปกติใน grep ที่คุณสามารถทำได้cat file | pee 'grep this' 'grep that' > lines.with.this.or.that.txt... โดยใช้ทีคุณจะได้รับสำเนาของfilestdout
ต่ำกว่า

>(command)คุณลักษณะที่เรียกว่ากระบวนการทดแทน
Vlastimil Ovčáčík

16

อาจเข้าใจได้ง่ายกว่าถ้าคุณเคยใช้มาteeก่อน เครื่องมือเก่าที่มีประโยชน์นี้ใช้อินพุตมาตรฐานและเขียนลงในหลายไฟล์รวมถึงเอาต์พุตมาตรฐาน ดังต่อไปนี้:

echo "Hello world" | tee one two

จะสร้างสองไฟล์ชื่อoneและทั้งที่มีสตริงtwo Hello worldมันจะพิมพ์ไปยังสถานีของคุณ


ตอนนี้peeทำหน้าที่คล้ายกัน แต่แทนที่จะเปลี่ยนเส้นทางไปยังไฟล์หลาย ๆ ไฟล์มันจะเปลี่ยนเส้นทางไปยังคำสั่งรองหลายอัน ala pipes มันแตกต่างกันเล็กน้อยจากteeในแง่ที่ว่ามันไม่ได้ส่ง stdin ดั้งเดิมไปยัง stdout เพราะมันจะไม่มีเหตุผลที่จะรวมเข้ากับเอาต์พุตของคำสั่งรอง ตัวอย่างง่ายๆดังต่อไปนี้:

echo "Hello world" | pee cat cat

จะส่งออกสตริงHello worldไปยังเทอร์มินัลของคุณสองครั้ง นี่เป็นเพราะทั้งสองกรณีของการcatรับเอาต์พุตมาตรฐานและทำสิ่งที่catทำซึ่งพิมพ์

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