Alternatif untuk perintah tee tanpa STDOUT

37

Saya menggunakan | sudo tee FILENAMEuntuk dapat menulis atau menambahkan file yang memerlukan izin pengguna super cukup sering.

Meskipun saya mengerti mengapa ini membantu dalam beberapa situasi, yang teejuga mengirimkan inputnya ke STDOUT lagi, saya tidak pernah benar-benar menggunakan bagian itu teeuntuk sesuatu yang berguna. Dalam kebanyakan situasi, fitur ini hanya menyebabkan layar saya diisi dengan jitter yang tidak diinginkan, jika saya tidak melakukan langkah ekstra dan secara manual membungkamnya tee 1> /dev/null.

Pertanyaan saya: Apakah ada perintah diseluruh, yang melakukan hal yang persis sama tee, tetapi apakah secara default tidak menghasilkan apa-apa untuk STDOUT?

aef
sumber
Jika Anda mengganti teedengan cat >filename, apakah Anda mendapatkan hasil yang Anda inginkan?
serbuk kayu
4
cattidak menulis ke file dengan sendirinya. Dan >operator tidak berfungsi karena file tidak dapat ditulisi oleh pengguna saya saat ini. Jadi tidak, itu tidak membantu sedikit pun. Dan tolong berhenti untuk sepenuhnya mengubah arti komentar Anda setiap 2 detik. Buat yang baru sebagai gantinya.
aef
Jika Anda mengganti | sudo tee FILENAMEdengan | sudo cat >filename, apakah Anda mendapatkan hasil yang Anda inginkan?
serbuk kayu
4
Tidak, >operator menggunakan pengguna shell saat ini untuk menulis ke file. Pengguna ini belum mendapatkan izin yang diperlukan. catsama sekali tidak berguna untuk itu.
aef
2
Lihat juga stackoverflow.com/questions/82256/…
Joachim Breitner

Jawaban:

30

Pilihan lain yang menghindari mengirim balik barang-barang itu /dev/zeroadalah

sudo command | sudo dd of=FILENAME
Joachim Breitner
sumber
1
Persis apa yang saya cari. Terima kasih banyak.
aef
4
superuser.com/a/850294/68284 menjelaskan oflag=append conv=notruncopsi tambahan yang digunakan dduntuk menambahkan.
aef
6

The ddsolusi masih mencetak sampah ke 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

Itu bisa dihindari menggunakan statusopsi:

command | sudo dd status=none of=FILENAME

Kemungkinan lain yang menarik (untuk Linux):

command | sudo cp /dev/stdin FILENAME

Untuk menyalin input TTY ke file, saya sering melakukan ini:

sudo cp /dev/tty FILENAME

Sayang sekali tee tidak memiliki opsi untuk menekan stdout.

Singkat
sumber
4

Anda bisa menggunakan skrip. Yaitu memasukkan sesuatu seperti ini di yaitu $HOME/bin/stee, 0teeatau serupa:

#!/bin/bash

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

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

#!/bin/bash

sudo tee "$@" > /dev/null

Buat itu bisa dieksekusi:

$ chmod 755 stee

Sekarang lakukan yaitu:

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

Luca Stein
sumber
1
Menulis skrip dan menyebarkannya ke semua sistem yang saya kerjakan bukanlah yang saya inginkan, tetapi sampai seseorang menyebutkan alat yang sudah ada, saya pikir saya akan menggunakan solusi Anda.
aef
2
Memang. Ingin melihatnya sendiri. Saya menulis sebuah program di C sejak lama yang melakukan apa yang Anda minta, tetapi itu sudah lama berlalu dan dilupakan. Hampir tidak ada minat untuk itu kembali ketika. Tapi sekali lagi saya tidak benar-benar mengiklankannya.
Luca Stein
2

Anda dapat membungkus seluruh perintah Anda menjadi sudo, jadi shell itu sendiri, serta pengalihan, dilakukan sebagai root:

sudo sh -c 'do_something > FILENAME'
Petir
sumber
-1

Tidak ada program langsung untuk melakukan itu (ini hanya satu-satunya waktu yang akan berguna), tetapi Anda dapat dengan mudah menulis sendiri. Jika Anda tidak ingin program Anda juga bisa menulis sebuah shell script sederhana yang melakukan hal yang sama: cat > $1. Ini berbeda dengan meletakkannya sejajar (seperti yang disarankan serbuk kayu) karena sudo akan berlaku untuk seluruh skrip, termasuk pengalihan.


sumber
-2

Saya tahu sedikit terlambat, tetapi apa yang saya lakukan dalam kasus seperti itu (ketika stdout 'flat' tetapi juga file sementara diperlukan) adalah:

tee whatever | grep -v ""
Juan Camilo Gomez Martinez
sumber
Bisakah Anda menguraikan lebih jauh apa yang dilakukan perintah ini?
Vylix
Sama seperti tee> / dev / null, tetapi sebaliknya memiplak ke grep yang tidak cocok dengan apa pun.
00prometheus
Kedengarannya lebih rumit daripada mengarahkan output /dev/null, dan tidak membuat perintah lebih pendek. Apa keuntungan menggunakan ini daripada metode yang asli?
waldyrious