dd出力を抑制するにはどうすればよいですか?


35

を使用してファイルを作成するbashスクリプトがありますdd。問題は、ddが大量の出力をスローして、スクリプトの出力を台無しにすることです。周りを検索して解決策を見つけました:

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

代替手段はあり/dev/nullますか、それとも唯一の方法にリダイレクトしていますか?


3
「スクリプトは特権を要求するべきではありません」という最後の文を失いました。それはリダイレクトとは何の関係もないようです/dev/null- dd書き込みアクセスが必要なため、あなたはsudoしています/dev/r$temp1(私は推測します)。ddの出力をどのように抑制しても、それを行う必要があります。出力のリダイレクトに/dev/nullルートは必要ありません
Michael Mrozek

私はアホです。/ dev / r $ temp1 /を使用しているため、許可されていない操作を提供していました。本当にごめんなさい。私は自分のものではないスクリプトを編集しており、気づいていませんでした。本当に申し訳ありません。
-dierre

その問題は、通常のユーザーでは、/ dev / R $ TEMP1またはDEV / nullにに書き込むことができないです
ジェット

心配しないでください。紛らわしい部分を削除するために少し編集しました
Michael Mrozek

1
ddの高度な機能を使用していない場合は、代わりcatheadまたはをtail使用します。
ジル 'SO-悪であるのをやめる'

回答:


16

dd(1)manページから:

   status=noxfer
          suppress transfer statistics

したがって:

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

これはまだ出力します

0+1 records in
0+1 records out

dd終了時にゴミになるので、データシンクへのリダイレクトは本当に唯一のオプションです。


それが怖かった。
-dierre

status = noxferは、通常は転送統計を示すSIGUSR1シグナルに関連していると思われます。しかし、私が言っていることが本当かどうかをテストするつもりはありません。
maxadamo

54

追加status=none

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

8.21ドキュメント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-好奇心が強い、なぜmanページから引用を編集するのか?
-don_crissti

@don_crisstiマニュアルページから引用を抽出する際の文脈の欠如は、わずかに異なる形式の単語が必要であることを意味すると感じました。それはマニュアルページに立っているので問題ありません。ここでは奇妙に見えました。
ロアイマ

@roaima-すべての権利-好奇心が満たされました:)-しかし、あなたはinfo page; ここの最初の答えには、からの正確な引用がありましたman page。ページがあいまいなinfo場合は、manページから直接コピー/貼り付けしますが、実際には、あなた次第です。
don_crissti

@don_crisstiオンラインで引用のあるマニュアルページを見つけることができませんでした。それに感謝します。(die.netには古いddがありますstatus=
roaima

3
dd(coreutils)8.13では利用できないようです: dd: invalid status flag: `none' Try `dd --help' for more information.
Lundberg Per

5

将来の参考のために:

dd出力を抑制するには、次のようにstderrを/ dev / nullに完全にリダイレクトします。

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

これは、たとえば、bashのtimeコマンドを使用してプロセスの時間を計り、ddが生成する出力を取得せずに結果を変数に割り当てる場合にうまく機能します。

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


2

BASHとZSHの最新バージョンでは、次のようなものも動作するはずです。

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

PSこれは私が実行した例にすぎません...


2

Unixアプリケーションまたはコマンドを使用して、すべての出力を抑制することができます

cmd >/dev/null 2>&1

最初のビットは、標準出力(ユニット番号1)を/ dev / nullにリダイレクトします。ただし、エラー出力(ユニット番号2)を番号1と同じ場所にリダイレクトするためにも、2番目の部分が必要です。

UNIXでは、STDIN = 0、STDOUT = 1およびSTDERR = 2



1
実際にstderrは、ファイル記述子があります2。(「STDERR = 3」は単なる誤植だと
思い

1
すべての出力を抑制することは望ましくありません。エラーが発生した場合、エラーメッセージを見たいと思います。
サムワトキンス

cmd 2>logfile.txtより適応したようです
-TheSola10

0

あなたがやろうとしていることを正しく理解している場合、そのsudoコマンドをスクリプトに入れて、そこでスクリプトを実行するときにパスワードを要求することを期待していますか?その場合、あなたは物事を複雑な方法で行っているだけです。

よりクリーンな解決策は、通常の方法で(つまりなしでsudo)スクリプトを記述し、スーパーユーザーとして実行することです。この背後にある理由は、スクリプトにスーパーユーザーアクセスが必要な場合は、アクセス権を与えるだけです(特定のコマンドまで待機する理由)。スクリプトで、rootとして実行されているかどうかを確認するには、次のようにします。

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

いや。それはまさに私がしたくないことです。ddに出力を表示させたくないので、スクリプトをrootとして実行したくありません。スクリプトをスーパーユーザーとして実行する場合、チェックは修正されます。
-dierre

@dierreでは、そもそもなぜ必要なのsudoですか?通常のユーザーは、問題なくリダイレ​​クトできるはず/dev/nullです。
プネヘヘ

私はUbuntuを使用していますが、許可されていない操作をしています...
ええと...-dierre

ごめんなさい。/ dev /の下に何かを作成していることに気付きませんでした。スクリプトは私のものではなく、編集していました。本当にごめんなさい。
ディエール

0

出力を通常のファイルにリダイレクトできます。つまり:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.