Làm thế nào để tôi ngăn chặn đầu ra dd?


35

Tôi có một tập lệnh bash tạo một số tập tin bằng cách sử dụng dd. Vấn đề là dd ném một lượng lớn đầu ra sẽ gây rối với đầu ra của tập lệnh của tôi. Tìm kiếm xung quanh tôi đã tìm thấy một giải pháp:

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

Có một sự thay thế, hoặc đang chuyển hướng đến /dev/nullcách duy nhất?


3
Tôi bị mất câu cuối cùng của bạn, "kịch bản không nên yêu cầu đặc quyền". Điều đó dường như không liên quan gì đến việc chuyển hướng đến /dev/null- bạn đang mắc lỗi vì ddcần quyền truy cập bằng văn bản /dev/r$temp1(tôi giả sử). Bạn sẽ cần phải làm điều đó cho dù bạn ngăn chặn ddđầu ra của bạn như thế nào ; chuyển hướng đầu ra đến /dev/nullkhông yêu cầu root
Michael Mrozek

Tôi là một thằng ngốc. Nó đã cho phép hoạt động không được phép vì sử dụng / dev / r $ temp1 /. Tôi thực sự xin lỗi. Tôi đang chỉnh sửa một kịch bản không phải của tôi và không nhận thấy nó. Thật sự xin lỗi.
dierre

Vì vậy, vấn đề là người dùng thông thường không thể ghi vào / dev / r $ temp1 hoặc dev / null
máy bay phản lực

Đừng lo lắng về điều đó; Tôi đã chỉnh sửa nó một chút để loại bỏ phần khó hiểu
Michael Mrozek

1
Nếu bạn không sử dụng bất kỳ của dd là tính năng tiên tiến, sử dụng cat, headhoặc tailthay thế.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


16

Từ dd(1)trang người đàn ông:

   status=noxfer
          suppress transfer statistics

do đó:

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

Điều này vẫn cho ra

0+1 records in
0+1 records out

rác khi ddthoát ra, vì vậy chuyển hướng đến một kho dữ liệu thực sự là lựa chọn duy nhất của bạn.


đó là điều tôi sợ
dierre

Tôi tin rằng status = noxfer, có thể liên quan đến tín hiệu SIGUSR1, thường hiển thị thống kê chuyển tiền. Dù sao, tôi không sẵn sàng kiểm tra xem nó có đúng như những gì tôi đang nói không.
maxadamo

54

Thêm status=none:

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

Từ dd (coreutils) 8.21 docs :

'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 - Chỉ tò mò, tại sao phải chỉnh sửa một trích dẫn từ trang người đàn ông?
don_crissti

@don_crissti Tôi cảm thấy bối cảnh (thiếu) trong việc trích dẫn trích dẫn từ trang man có nghĩa là nó yêu cầu một dạng từ hơi khác. Khi nó đứng trong trang người đàn ông, nó ổn; Ở đây trông nó thật lạ.
roaima

@roaima - được rồi - sự tò mò thỏa mãn :) - nhưng lưu ý rằng bạn liên kết đến info page; câu trả lời ban đầu ở đây đã có trích dẫn chính xác từ man page. Tôi sẽ sao chép / dán trực tiếp từ infotrang nếu mantrang đó mơ hồ nhưng thực sự, tùy bạn ... Oh, btw, cảm ơn rất nhiều vì nhận xét khác của bạn về câu trả lời của tôi liên quan đến việc sắp xếp theo ngày trong tuần.
don_crissti

@don_crissti Tôi không thể tìm thấy một trang người đàn ông trực tuyến có trích dẫn; cảm ơn bạn vì điều đó (die.net có người già hơn ddmà không có status=)
roaima

3
Dường như không có sẵn trong dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Per Lundberg

5

Để tham khảo trong tương lai:

Để chặn đầu ra dd hoàn toàn chuyển hướng stderr sang / dev / null như vậy:

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

Điều này hoạt động độc đáo nếu bạn muốn, ví dụ, thời gian xử lý bằng cách sử dụng lệnh thời gian trong bash và gán kết quả cho một biến, mà không nhận được bất kỳ đầu ra nào mà dd tạo ra.

tham khảo: http://www.unix.com/shell-programming-and-scripting/131624-how-suppress-dd-output.html


2

Một cái gì đó như thế này cũng sẽ phù hợp với bạn với các phiên bản BASH và ZSH gần đây:

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

PS Đây chỉ là một ví dụ tôi đã chạy ...


2

Với bất kỳ ứng dụng hoặc lệnh Unix nào, bạn có thể chặn tất cả đầu ra bằng

cmd >/dev/null 2>&1

Bit đầu tiên chuyển hướng đầu ra tiêu chuẩn (đơn vị số 1) thành / dev / null. Nhưng bạn cần phần thứ hai C ALNG chuyển hướng đầu ra lỗi (đơn vị số 2) đến cùng một vị trí với số 1.

Trong UNIX, STDIN = 0, STDOUT = 1 và STDERR = 2



1
Trên thực tế, stderrcó mô tả tập tin 2 . (Tôi cho rằng "STDERR = 3" chỉ là một lỗi đánh máy.)
n.st

1
Nó là không mong muốn để ngăn chặn tất cả đầu ra. Nếu xảy ra lỗi, chúng tôi muốn xem thông báo lỗi.
Sam Watkins

cmd 2>logfile.txtcó vẻ thích nghi hơn
TheSola10

0

Nếu tôi hiểu chính xác những gì bạn đang cố gắng làm, bạn có đặt sudolệnh đó vào tập lệnh và mong đợi tập lệnh sẽ nhắc mật khẩu của bạn khi nó chạy ở đó không? Trong trường hợp đó bạn chỉ đang làm mọi thứ theo cách phức tạp.

Một giải pháp sạch hơn là viết kịch bản theo cách thông thường (nghĩa là không có sudo) và chạy nó dưới dạng siêu người dùng . Lý do đằng sau điều này là, nếu tập lệnh cần quyền truy cập siêu người dùng, thì chỉ cần cấp cho nó quyền truy cập (tại sao phải đợi cho đến khi có lệnh nào đó?). Trong tập lệnh, để kiểm tra xem nó có đang được chạy dưới quyền root hay không, hãy làm một cái gì đó như thế này:

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

không Đó chính xác là những gì tôi không muốn làm. Tôi không muốn tập lệnh chỉ được chạy bằng root vì tôi không muốn dd hiển thị đầu ra. Kiểm tra của bạn sẽ chính xác nếu tôi muốn tập lệnh được chạy dưới dạng siêu người dùng.
dierre

@dierre Vậy tại sao bạn cần sudongay từ đầu? Người dùng bình thường sẽ có thể chuyển hướng mọi thứ để /dev/nulltốt.
phunehehe

Tôi đang sử dụng Ubuntu và nó không cho phép tôi hoạt động ... uhm ...
dierre

Tôi xin lôi. Tôi không nhận thấy tôi đang tạo ra một cái gì đó dưới / dev /. Kịch bản không phải của tôi, tôi đã chỉnh sửa nó. Tôi thực sự xin lỗi.
dierre

0

bạn có thể chuyển hướng đầu ra thành một tệp thông thường, tức là:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.