将多个顺序命令的输出写入文本文件


22

我尝试检查最新的Firefox,并希望将所有哈希值保存在一个TXT文件中。

我想做的是:

sha1sum firefox.tar.gz > sha.txt

我也尝试:

md5sum firefox.tar.gz > sha.txt | sha1sum firefox.tar.gz > sha.txt | sha512sum firefox.tar.gz > sha.txt 

但在这种情况下,仅将最后一个sha512打印到sha.txt。

我究竟做错了什么?请在那里的人可以帮助我吗?

Answers:


31

正如其他人已经指出>(重写)和>>(追加)重定向运算符之间的区别一样,我将提供一些解决方案。

  1. 您可以使用的命令分组{}功能bash将所有命令的输出发送到单个文件中:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. 或者,您可以在子shell中运行命令()

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt

1
其解决方案被认为是更通用/便携式{}()?谢谢。
codeaviator

5
@codeaviator子壳:()
heemayl

5

您需要使用附加重定向器>>代替>后续命令,例如

sha1sum zeromq-4.1.2.tar.gz > sha.txt
md5sum zeromq-4.1.2.tar.gz  >> sha.txt 
sha512sum zeromq-4.1.2.tar.gz >> sha.txt 

Appending Redirected Output bash手册页(man bash)的部分。


1

>重定向将命令输出(stdout而不是stderr-你用2>的那个)到后指定的文件。如果已经存在,该文件将被覆盖。

此行为对于您的第一个命令很有用:如果存在现有文件,则应将其删除并替换为新文件。

但是,由于需要附加所有其他输出而不是替换先前的输出,因此需要使用append-redirector >>。如果尚不存在,则会创建一个文件,但是会将重定向的输出附加到该文件(如果已存在)。


并且请不要使用管道|在一行中编写多个命令,这会重定向第一个命令的输出(stdout)到第二个命令的输入(stdin)。

您可以使用分号(;)告诉bash在一个命令之后执行另一个命令,就好像它是脚本文件一样。如果命令失败(返回码不为0),其余命令仍将执行。

或者,您可以选择逻辑运算符AND(&&)或OR(||):
如果&&用于连接两个命令,则只有第一个成功(返回码为0)时,才会执行第二个命令。如果失败,则以下命令均不会运行。
||然而,运行第二个命令,如果第一个失败(返回代码不为0)!

因此,在您的情况下,我建议您使用分号:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
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.