Bagaimana cara menekan output dd?

35

Saya memiliki skrip bash yang membuat beberapa file menggunakan dd. Masalahnya adalah dd melempar sejumlah besar output yang akan mengacaukan output dari skrip saya. Mencari-cari di sekitar saya menemukan solusi:

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

Apakah ada alternatif, atau mengarahkan ke /dev/nullsatu-satunya cara?

dierre
sumber
3
Saya bingung dengan kalimat terakhir Anda, "skrip seharusnya tidak meminta hak istimewa". Itu tampaknya tidak ada hubungannya dengan pengalihan ke /dev/null- Anda sudoing karena ddperlu akses tulis /dev/r$temp1(saya berasumsi). Anda harus melakukan itu tidak masalah bagaimana Anda menekan ddoutput; mengalihkan keluaran ke /dev/nulltidak memerlukan root
Michael Mrozek
Saya seorang idiot. Itu memberi operasi tidak diizinkan karena penggunaan / dev / r $ temp1 /. Aku sangat menyesal. Saya mengedit naskah yang bukan milik saya dan tidak menyadarinya. Sangat menyesal
dierre
jadi masalahnya adalah pengguna biasa tidak bisa menulis ke / dev / r $ temp1 atau ke dev / null
jet
Jangan khawatir tentang itu; Saya sedikit mengeditnya untuk menghapus bagian yang membingungkan
Michael Mrozek
1
Jika Anda tidak menggunakan salah satu fitur canggih dd, gunakan cat, headatau tailsebagai gantinya.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

16

Dari dd(1)halaman manual:

   status=noxfer
          suppress transfer statistics

demikian:

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

Ini masih menampilkan

0+1 records in
0+1 records out

sampah saat ddkeluar, jadi mengarahkan kembali ke wastafel data adalah satu-satunya pilihan Anda.

amphetamachine
sumber
itu yang saya takutkan.
dierre
Saya percaya status = noxfer, bisa terkait dengan sinyal SIGUSR1, yang biasanya menunjukkan statistik transfer. Namun, saya tidak mau menguji apakah benar apa yang saya katakan.
maksadamo
54

Tambahkan status=none:

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

Dari dd (coreutils) 8.21 dokumen :

'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.
orgoj
sumber
@roaima - hanya ingin tahu, mengapa mengedit kutipan dari halaman manual?
don_crissti
@don_crissti Saya merasakan (kurangnya) konteks dalam mengekstraksi kutipan dari halaman manual berarti bahwa itu memerlukan bentuk kata yang sedikit berbeda. Seperti yang ada di halaman manual, tidak apa-apa; di sini terlihat aneh.
roaima
@roaima - oke - rasa ingin tahu puas :) - tetapi perhatikan bahwa Anda menautkan ke info page; jawaban awal di sini memiliki kutipan yang tepat dari man page. Saya akan menyalin / menempel langsung dari infohalaman jika manhalamannya ambigu tapi sungguh, terserah Anda ... Oh, btw, terima kasih banyak atas komentar Anda yang lain atas jawaban saya terkait dengan pengurutan berdasarkan hari kerja.
don_crissti
@don_crissti Saya tidak dapat menemukan halaman manual online yang memiliki kutipan; terima kasih untuk yang itu. (die.net memiliki yang lebih tua ddtanpa status=)
roaima
3
Sepertinya tidak tersedia dalam dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Per Lundberg
5

Untuk referensi di masa mendatang:

Untuk menekan output dd sepenuhnya mengarahkan stderr ke / dev / null seperti:

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

Ini berfungsi dengan baik jika Anda ingin, misalnya, mengatur waktu proses menggunakan perintah waktu dalam bash dan menetapkan hasilnya ke variabel, tanpa mendapatkan output apa pun yang dd hasilkan.

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

CSCH
sumber
2

Sesuatu seperti ini juga bisa digunakan untuk Anda dengan versi BASH dan ZSH terbaru:

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

PS Ini hanya contoh saya berlari ...

slashdot
sumber
2

Dengan aplikasi atau perintah Unix apa pun, Anda dapat menekan semua output

cmd >/dev/null 2>&1

Bit pertama mengarahkan ulang output standar (unit nomor 1) ke / dev / null. Tetapi Anda perlu bagian kedua untuk JUGA redirect output kesalahan (unit nomor 2) ke tempat yang sama dengan nomor 1.

Dalam UNIX, STDIN = 0, STDOUT = 1 dan STDERR = 2


Michael Dillon
sumber
1
Sebenarnya, stderrmemiliki file deskriptor 2 . (Saya berasumsi "STDERR = 3" hanyalah salah ketik.)
n.st
1
Tidak diinginkan untuk menekan semua output. Jika terjadi kesalahan, kami ingin melihat pesan kesalahan tersebut.
Sam Watkins
cmd 2>logfile.txttampaknya lebih disesuaikan
TheSola10
0

Jika saya mengerti benar apa yang Anda coba lakukan, apakah Anda memasukkan sudoperintah itu ke dalam skrip dan mengharapkan skrip untuk meminta kata sandi Anda ketika dijalankan di sana? Dalam hal ini Anda hanya melakukan hal-hal dengan cara yang rumit.

Solusi yang lebih bersih adalah dengan menulis skrip dengan cara biasa (yaitu tanpa sudo) dan menjalankannya sebagai superuser . Alasan di balik ini adalah, jika skrip membutuhkan akses pengguna super, maka berikan saja aksesnya (mengapa menunggu sampai perintah tertentu?). Dalam skrip, untuk memeriksa apakah sedang dijalankan sebagai root, lakukan sesuatu seperti ini:

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi
phhehehe
sumber
nggak. Itulah tepatnya yang tidak ingin saya lakukan. Saya tidak ingin skrip dijalankan sebagai root hanya karena saya tidak ingin dd menampilkan output. Pemeriksaan Anda akan benar jika saya ingin skrip dijalankan sebagai superuser.
dierre
@ierre Jadi mengapa Anda perlu sudodi tempat pertama? Pengguna normal harus bisa mengarahkan hal-hal menjadi /dev/nullbaik-baik saja.
phunehehe
Saya menggunakan Ubuntu dan itu memberi saya operasi tidak diizinkan ... uhm ...
dierre
Maafkan saya. Saya tidak memperhatikan bahwa saya sedang menciptakan sesuatu di / dev /. Script itu bukan milik saya, saya mengeditnya. Aku sangat menyesal.
dierre
0

Anda dapat mengarahkan output ke file biasa yaitu:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
jet
sumber