我尝试检查最新的 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
将所有命令的输出发送到单个文件中:{ sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
或者,您也可以在子 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 Output
bash 手册页的部分 ( 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