ทางเลือกแทนคำสั่ง tee โดยไม่มี STDOUT


37

ฉันใช้| sudo tee FILENAMEเพื่อให้สามารถเขียนหรือผนวกเข้ากับไฟล์ที่ต้องการสิทธิ์ superuser ค่อนข้างบ่อย

แม้ว่าฉันจะเข้าใจว่าทำไมมันถึงมีประโยชน์ในบางสถานการณ์ แต่มันteeก็ส่งอินพุตไปยัง STDOUT อีกครั้ง แต่ฉันไม่เคยใช้ส่วนนั้นteeเพื่อประโยชน์อะไร tee 1> /dev/nullในสถานการณ์ส่วนใหญ่คุณลักษณะนี้จะทำให้หน้าจอของฉันเท่านั้นที่จะเต็มไปด้วยความกระวนกระวายใจที่ไม่พึงประสงค์ถ้าฉันไม่ไปขั้นตอนพิเศษด้วยตนเองและเงียบด้วย

คำถามของฉัน: มีคำสั่ง arround ซึ่งทำสิ่งเดียวกันteeทุกประการ แต่โดยค่าเริ่มต้นจะไม่ส่งออกอะไรไปยัง STDOUT?


หากคุณแทนที่teeด้วยcat >filenameคุณจะได้รับผลลัพธ์ที่คุณต้องการ?
ขี้เลื่อย

4
catไม่ได้เขียนลงไฟล์เอง และ>โอเปอเรเตอร์ไม่ทำงานเนื่องจากไฟล์ไม่สามารถเขียนได้โดยผู้ใช้ปัจจุบันของฉัน ดังนั้นไม่ได้ช่วยอะไรนิดหน่อย และโปรดหยุดการเปลี่ยนแปลงความหมายของความคิดเห็นของคุณอย่างสมบูรณ์ทุก 2 วินาที สร้างใหม่แทน
aef

หากคุณแทนที่| sudo tee FILENAMEด้วย| sudo cat >filenameคุณจะได้รับผลลัพธ์ที่คุณต้องการ?
ขี้เลื่อย

4
ไม่>โอเปอเรเตอร์ใช้ผู้ใช้เชลล์ปัจจุบันเพื่อเขียนไปยังไฟล์ ผู้ใช้รายนี้ไม่ได้รับสิทธิ์ที่จำเป็น catไร้ประโยชน์อย่างสมบูรณ์สำหรับสิ่งนั้น
aef

คำตอบ:


30

อีกทางเลือกหนึ่งที่จะหลีกเลี่ยงการวางสิ่งต่าง ๆ กลับมา/dev/zeroเป็น

sudo command | sudo dd of=FILENAME

1
สิ่งที่ฉันกำลังมองหา ขอบคุณมาก
aef

4
superuser.com/a/850294/68284อธิบายถึงoflag=append conv=notruncตัวเลือกเพิ่มเติมที่ใช้ddสำหรับการต่อท้าย
aef

6

ddวิธีการแก้ไขยังพิมพ์ขยะไปที่ stdout:

$ ls | sudo dd of=FILENAME
0+1 records in
0+1 records out
459 bytes (459 B) copied, 8.2492e-05 s, 5.6 MB/s

ที่สามารถหลีกเลี่ยงได้โดยใช้statusตัวเลือก:

command | sudo dd status=none of=FILENAME

ความเป็นไปได้อื่นที่น่าสนใจ (สำหรับ Linux อยู่แล้ว):

command | sudo cp /dev/stdin FILENAME

หากต้องการคัดลอกอินพุต TTY ไปยังไฟล์ฉันมักจะทำสิ่งนี้:

sudo cp /dev/tty FILENAME

มันแย่มากทีที่ไม่มีตัวเลือกในการยับยั้ง stdout


4

คุณสามารถใช้สคริปต์ เช่นใส่อะไรเช่นนี้ใน IE $HOME/bin/stee, 0teeหรือคล้ายกัน:

#!/bin/bash

argv=
while [[ "$1" =~ ^- ]]; do
    argv+=" $1"
    shift
done

sudo tee $argv "$1" > /dev/null

#!/bin/bash

sudo tee "$@" > /dev/null

ทำให้สามารถเรียกใช้งานได้:

$ chmod 755 stee

ตอนนี้ทำคือ:

$ ls -la | stee -a / root / foo


1
การเขียนสคริปต์และปรับใช้กับระบบทั้งหมดที่ฉันทำงานไม่ใช่สิ่งที่ฉันต้องการอย่างแน่นอน แต่จนกว่าจะมีใครบางคนตั้งชื่อเครื่องมือที่มีอยู่แล้วฉันคิดว่าฉันจะไปกับโซลูชันของคุณ
aef

2
จริง อยากจะเห็นมันด้วยตัวเอง ฉันเขียนโปรแกรมใน C เป็นเวลานานว่าทำสิ่งที่คุณถาม แต่มันหายไปนานและลืม เมื่อไม่นานมานี้ก็ไม่มีความสนใจ แต่อีกครั้งฉันก็ไม่ได้โฆษณามันมากนัก
Luca Stein

2

คุณสามารถรวมคำสั่งทั้งหมดของคุณลงใน sudo ดังนั้นเชลล์เองรวมถึงการเปลี่ยนเส้นทางจะดำเนินการrootดังนี้:

sudo sh -c 'do_something > FILENAME'

-1

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


-2

ฉันรู้ว่าสายเกินไปเล็กน้อย แต่สิ่งที่ฉันทำในกรณีเช่นนี้ (เมื่อ stdout 'flat' แต่ยังจำเป็นต้องใช้ไฟล์ชั่วคราว):

tee whatever | grep -v ""

คุณช่วยอธิบายเพิ่มเติมว่าคำสั่งนี้กำลังทำอะไรอยู่?
Vylix

เหมือนกับ tee> / dev / null แต่แทนที่จะส่งไปที่ grep ที่ไม่ตรงกับสิ่งใดเลย
00prometheus

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