将多个连续命令的输出写入文本文件

将多个连续命令的输出写入文本文件

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

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

  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
    

答案2

您需要使用附加重定向器>>而不是>后续命令,例如

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 Outputbash 手册页的部分 ( man bash)。

答案3

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

相关内容