STDOUT olmadan tee komutuna alternatif


37

Ben kullanıyorum | sudo tee FILENAMEsüper izinleri oldukça sık yapılmasını gerektiren bir dosyaya yazma veya ekleme yapılması mümkün.

Neden bazı durumlarda faydalı olduğunu anlamama rağmen tee, girdilerini tekrar STDOUT'a da gönderebilse de, bu kısmı teeyararlı bir şey için hiç kullanmadım . Çoğu durumda, bu özellik yalnızca fazladan bir adım atmazsam ve manuel olarak susturursam ekranımın istenmeyen dalgalanmalarla dolmasına neden olur tee 1> /dev/null.

Sorum şu: Tam olarak aynı şeyi yapan tee, ancak varsayılan olarak STDOUT'a bir şey çıkaran bir komut çevreleyen var mı?


Eğer değiştirirseniz teeile cat >filename, istediğiniz sonuçları getirmezse mı?
talaş

4
cattek başına dosyalara yazmaz. Ve >operatör dosyaları benim şimdiki kullanıcı tarafından yazılabilir değil gibi çalışmaz. Yani hayır, bu biraz yardımcı olmuyor. Ve lütfen yorumunuzu her 2 saniyede bir tamamen değiştirmek için durun. Bunun yerine yenisini yapın.
aef

Eğer değiştirirseniz | sudo tee FILENAMEile | sudo cat >filename, istediğiniz sonuçları getirmezse mı?
talaş

4
Hayır, >operatör dosyaya yazmak için mevcut kabuk kullanıcısını kullanır. Bu kullanıcı gerekli izinlere sahip değil. catbunun için tamamen işe yaramaz.
aef

Yanıtlar:


30

Kaçınır sonra malzeme geri boru ve diğer bir seçenek /dev/zeroDİR

sudo command | sudo dd of=FILENAME

1
Tam olarak aradığım şeydi. Çok teşekkürler.
aef

4
superuser.com/a/850294/68284 eklemek oflag=append conv=notrunciçin kullanılacak ek seçenekleri açıklar dd.
aef,

6

ddÇözelti hala Stdout'a önemsiz yazdırır:

$ 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

Bu statusseçenek kullanılarak önlenebilir :

command | sudo dd status=none of=FILENAME

Başka ilginç bir olasılık (yine de Linux için):

command | sudo cp /dev/stdin FILENAME

TTY girişini bir dosyaya kopyalamak için, genellikle bunu yaparım:

sudo cp /dev/tty FILENAME

Çok kötü bir tee stdout bastırmak için bir seçeneğiniz yok.


4

Bir komut dosyası kullanabilirsiniz. Yani ie böyle bir şey koymak $HOME/bin/stee, 0teeya da benzer:

#!/bin/bash

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

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

#!/bin/bash

sudo tee "$@" > /dev/null

Yürütülebilir yap:

$ chmod 755 stee

Şimdi yani:

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


1
Bir senaryo yazmak ve üzerinde çalıştığım tüm sistemlere dağıtmak tam olarak istediğim şey değil, ancak biri zaten var olan bir aracı söyleyene kadar, çözümünle devam edeceğimi düşünüyorum.
aef

2
Aslında. Kendim görmek isterdim. C de istediğini yapan uzun zaman önce bir program yazdım, ama uzun zaman geçti ve unutuldu. Ne zaman geri ilgi yoktu. Ama sonra tekrar aslında fazla reklam yapmadım.
Luca Stein

2

Komutunuzun tamamını sudo'ya sarabilirsiniz, böylece kabuğun kendisi ve yönlendirmeler de şöyle yapılır root:

sudo sh -c 'do_something > FILENAME'

-1

Bunu yapmak için doğrudan bir program yoktur (faydalı olacağı tek zaman budur), ama kolayca kendiniz yazabilirsiniz. Programa istemiyorsanız, ayrıca aynı şeyi yapar basit bir shell script yazabilirsiniz: cat > $1. Bu, satır içi (talaş önerildiği gibi) koymaktan farklıdır çünkü sudo, yeniden yönlendirme de dahil olmak üzere tüm komut dosyasına uygulanacaktır.


-2

Biliyorum biraz çok geç, ancak bu gibi durumlarda ne yapmalıyım ('düz' bir stdout ve aynı zamanda geçici bir dosya gerektiğinde):

tee whatever | grep -v ""

Bu komutun ne yaptığını daha ayrıntılı olarak açıklayabilir misiniz?
Vylix

Tee> / dev / null ile aynıdır, fakat bunun yerine hiçbir şeye uymayan bir eşeğe boru döşemek.
00prometheus

Bu, çıktının yönlendirilmesinden çok daha sahte geliyor /dev/nullve komutu daha da kısaltmıyor. Orijinal yöntem yerine bunu kullanmanın avantajı ne olurdu?
waldyrious
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.