Dd çıkışını nasıl bastırabilirim?


35

Kullanarak bazı dosyalar oluşturan bir bash betiğim var dd. Sorun şu ki dd, betiğimin çıktısını bozacak büyük miktarda çıktı atıyor. Arama yaparak bir çözüm buldum:

dd if=boot1h of="/dev/r$temp1" >& /dev/null

Bir alternatif var mı, yoksa /dev/nulltek yöne mi yönlendiriyor ?


3
Son cümlede kayboldum, "senaryo ayrıcalıklar istememeli". Bunun, yeniden yönlendirmeyle ilgisi yok gibi görünüyor /dev/null- sudoing yapıyorsunuz çünkü ddyazma erişimi gerekiyor /dev/r$temp1(Sanırım). Çıktısını nasıl bastırdığınız önemli değil, bunu yapmanız gerekecek dd; Çıktının yeniden yönlendirilmesi /dev/nullroot gerektirmiyor
Michael Mrozek

Ben bir aptalım. / Dev / r $ temp1 / kullanımı nedeniyle izin verilmemesi nedeniyle işlem yapıldı. Gerçekten üzgünüm. Benim olmayan ve fark etmemiş bir senaryo düzenledim. Gerçekten özür dilerim.
dierre

bu yüzden sorun düzenli kullanıcı / dev / r $ temp1 veya dev / null yazamaz
jet

Endişelenme; Kafa karıştırıcı kısmını çıkarmak için biraz düzenlemiştim
Michael Mrozek

1
Eğer kullanmıyorsanız gg herhangi gelişmiş özellikler, kullanım var cat, headya tailonun yerine.
Gilles 'SO- kötülük olmayı bırak'

Yanıtlar:


16

Gönderen dd(1)adam sayfası:

   status=noxfer
          suppress transfer statistics

Böylece:

dd if=boot1h of="/dev/r$temp1" status=noxfer

Bu hala çıktılar

0+1 records in
0+1 records out

Çıkarken çöp dd, yani bir veri havuzuna yönlendirmek gerçekten tek seçeneğinizdir.


Bundan korkuyordum.
dierre

Durum = noxfer'ın, normalde transfer istatistiğini gösteren SIGUSR1 sinyaliyle ilişkili olabileceğine inanıyorum. Hoewever, söylediklerimin doğru olup olmadığını sınamak istemiyorum.
maxadamo

54

Ekle status=none:

dd if=boot1h of="/dev/r$temp1" status=none

Dan 8.21 docs dd (coreutils) :

'status=LEVEL'
     Transfer information is normally output to stderr upon receipt of
     the 'INFO' signal or when 'dd' exits.  Specifying LEVEL will adjust
     the amount of information printed, with the last LEVEL specified
     taking precedence.

     'none'
          Do not print any informational or warning messages to stderr.
          Error messages are output as normal.

     'noxfer'
          Do not print the final transfer rate and volume statistics
          that normally make up the last status line.

     'progress'
          Print the transfer rate and volume statistics on stderr, when
          processing each input block.  Statistics are output on a
          single line at most once every second, but updates can be
          delayed when waiting on I/O.

@roaima - sadece merak ediyorum, neden man sayfasından bir alıntı düzenliyorsunuz?
don_crissti

@don_crissti Alıntı sayfasından alıntıyı çıkarırken (eksik) bağlamının biraz farklı bir kelime biçimi gerektirdiği anlamına geldiğini hissettim. O duruyor gibi adam sayfasında gayet; burada garip görünüyordu.
roaima

@roaima - tamam - meraktan memnunum :) - ama sen buna bağlandığını unutma info page; İlk cevap burada vardı bire bir alıntı yaparak gelen man page. Sayfa belirsiz, ancak gerçekten size kalmışsa, doğrudan infosayfadan kopyalayıp yapıştırırdım man... Oh, btw, haftaya göre sıralama ile ilgili cevabım hakkındaki diğer yorumunuz için teşekkür ederim.
don_crissti

@don_crissti Online olarak alıntı yapan bir adam sayfası bulamadım; bunun için teşekkür ederim. (die.net ddolmadan daha eski olan status=)
roaima

3
DD'de (coreutils) bulunmuyor gibi görünüyor 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Per Lundberg

5

Gelecekteki referans için:

Dd çıktısını tamamen bastırmak için stderr komutunu / dev / null komutuna şöyle yönlendirin:

dd if=/dev/urandom of=sample.txt bs=5MB count=1 2> /dev/null

Bu, örneğin bash'deki time komutunu kullanarak işlemi zamanlamak ve sonucu, dd'nin ürettiği herhangi bir çıktıyı almadan, bir değişkene atamak istiyorsanız, güzel çalışır.

başvuru: http://www.unix.com/shell-programming-and-scripting/131624-how-suppress-dd-output.html


2

Bunun gibi bir şey de BASH ve ZSH'nin son sürümlerinde sizin için çalışmalıdır:

dd if=/path/to/file of=/path/to/another_file bs=1M count=1 &> /dev/null

Ps Bu koştum sadece bir örnek ...


2

Herhangi bir Unix uygulaması veya komutuyla, tüm çıktıları bastırabilirsiniz.

cmd >/dev/null 2>&1

İlk bit, standart çıkışı (birim no 1) / dev / null'a yönlendirir. Ancak, ikinci kısımda ayrıca ALSO'nun hata çıktısını (ünite no 2) 1 numaralı ile aynı yere yönlendirmesi gerekir.

UNIX'de STDIN = 0, STDOUT = 1 ve STDERR = 2



1
Aslında, 2stderr dosya tanımlayıcısına sahip . (I "STDERR = 3" sadece bir yazım hatası olduğunu varsayalım.)
n.st

1
Tüm çıktıların bastırılması istenmez. Bir hata olursa, hata mesajını görmek isteriz.
Sam Watkins,

cmd 2>logfile.txtdaha adapte görünüyor
TheSola10

0

Ne yapmaya çalıştığınızı doğru anlarsam, bu sudokomutu betiğe ekleyip, betiğin orada çalıştığında şifrenizi sormasını mı bekliyorsunuz? Bu durumda, işleri karmaşık bir şekilde yapıyorsunuz.

Daha temiz bir çözüm, komut dosyasını her zamanki gibi (yani olmadan sudo) yazmak ve süper kullanıcı olarak çalıştırmaktır . Bunun arkasındaki neden, komut dosyası süper kullanıcı erişimine ihtiyaç duyuyorsa, o zaman sadece erişim izni verin (neden belirli bir komuta kadar beklemelisiniz?). Kodda, root olarak çalıştırılıp çalıştırılmadığını kontrol etmek için şöyle bir şey yapın:

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

Hayır. Bu tam olarak yapmak istemediğim şey. Komut dosyasının yalnızca root olarak çalıştırılmasını istemiyorum çünkü çıktıyı görüntülemek için dd istemiyorum. Komut dosyasının süper kullanıcı olarak çalıştırılmasını istersem, çekiniz doğru olur.
dierre

@dierre Öyleyse neden sudoilk başta ihtiyacın vardı? Normal kullanıcılar işleri yoluna sokabilecek kadar /dev/nulliyi durumda olmalıdır.
phunehehe,

Ubuntu kullanıyorum ve bana izin verilmeyen bir işlem veriyor ... uhm ...
dierre,

Üzgünüm. / Dev / altında bir şeyler yarattığımı fark etmedim. Senaryo benim değil, düzenliyordum. Gerçekten üzgünüm.
dierre

0

Çıktıyı normal bir dosyaya yönlendirebilirsiniz, yani:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
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.