如何抑制dd输出?


35

我有一个bash脚本,可使用创建一些文件dd。问题是dd抛出了大量的输出,这将使我的脚本的输出混乱。经过搜索,我找到了解决方案:

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

是否有替代方法,或者重定向到/dev/null唯一方法?


3
我在您的最后一句话“脚本不应请求特权”时迷失了。这似乎与重定向到没有任何关系/dev/null-您正在s嘘,因为dd需要对/dev/r$temp1(我假设)具有写权限。无论您如何抑制dd的输出,都需要这样做。将输出重定向到/dev/null不需要根
Michael Mrozek

我是个白痴。由于使用了/ dev / r $ temp1 /,因此不允许进行操作。我真的很抱歉。我正在编辑一个不是我的脚本,也没有注意到它。真对不起。
dierre'1

所以这个问题是普通用户无法写入到/ dev / R $ temp1目录或开发/空

不用担心 我对其进行了一些编辑以删除令人困惑的部分
Michael Mrozek

1
如果你不使用任何DD的先进功能,使用catheadtail代替。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


16

dd(1)手册页:

   status=noxfer
          suppress transfer statistics

从而:

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

这仍然输出

0+1 records in
0+1 records out

dd退出时会产生垃圾,因此重定向到数据接收器确实是您唯一的选择。


那是我担心的。
2011年

我相信status = noxfer可能与SIGUSR1信号有关,该信号通常显示传输统计信息。但是,我不愿意测试我说的是真的。
maxadamo

54

添加status=none

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

来自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-很好奇,为什么要编辑手册页中的报价?
don_crissti 2015年

@don_crissti我觉得从手册页中提取引号的上下文(缺少)意味着它需要略微不同的单词形式。正如它在手册页中所说的那样,这很好。在这里看起来很奇怪。
roaima 2015年

@roaima-很好-好奇心很满足:)-但请注意,您链接到info page;这里最初的回答有确切的报价man pageinfo如果man页面模棱两可,我会直接从页面复制/粘贴,但实际上取决于您...哦,顺便说一句,非常感谢您对我的其他答复,有关按星期排序的评论。
don_crissti 2015年

@don_crissti我在网上找不到带有引号的手册页;谢谢你的那一个。(die.net的年龄较大,dd没有status=
roaima 2015年

3
dd(coreutils)8.13中似乎不可用: dd: invalid status flag: `none' Try `dd --help' for more information.
Per Lundberg 2015年


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相同的位置。

在UNIX中,STDIN = 0,STDOUT = 1和STDERR = 2



1
实际上,stderr具有文件描述符2。(我假设“ STDERR = 3”只是一个错字。)
2014年

1
不希望抑制所有输出。如果发生错误,我们希望看到错误消息。
山姆·沃特金斯

cmd 2>logfile.txt似乎更适应
TheSola10 '17

0

如果我正确理解您要执行的操作,您是否将该sudo命令放入脚本中并期望脚本在该脚本中运行时提示您输入密码?在这种情况下,您只是在以复杂的方式处理事务。

较干净的解决方案是以通常的方式编写脚本(即,不编写脚本sudo),然后以超级用户身份运行它。这背后的原因是,如果脚本需要超级用户访问权限,则只需为其提供访问权限(为什么要等到特定命令?)。在脚本中,要检查它是否以root身份运行,请执行以下操作:

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

不。那正是我不想做的。我不希望脚本仅作为root用户运行,因为我不希望dd显示输出。如果我希望脚本以超级用户身份运行,您的检查将更正。
2011年

@dierre那么,为什么首先需要sudo?普通用户应该能够将事情重定向到/dev/null正常状态。
phunehehe

我正在使用Ubuntu,这使我无法进行操作...嗯...
2011年

对不起。我没有注意到我在/ dev /下创建了一些东西。该脚本不是我的,我正在编辑它。我真的很抱歉。
dierre'1

0

您可以将输出重定向到常规文件,即:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.