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

我尝试检查最新的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。

我究竟做错了什么? 请有人帮我这个吗?

正如其他人已经指出了> (覆盖)和>> (追加)重定向运算符之间的区别,我将给出几个解决方案。

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

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

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

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

 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 

请参阅bash手册页( man bash )的“ Appending Redirected Output部分。

>重定向器将命令的输出( 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