在 Kubuntu Linux 上,Google Chrome 浏览器会为文件添加校验和,以防止手动编辑文件。所以我正在编写一个脚本来添加校验和。
$ cat .config/google-chrome/Default/Custom\ Dictionary.txt
AATEST
dotancohen
checksum_v1 = 2b7288da7c9556608de620e65308efa4$
没问题,我将复制整个文件(不包括最后一行)并检查其 MD5 哈希值是否与校验和匹配。
$ head -n -1 .config/google-chrome/Default/Custom\ Dictionary.txt > ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
$ md5sum ~/chrome-dict
2b7288da7c9556608de620e65308efa4 /home/dotancohen/chrome-dict
正如预期的那样,我们得到了2b7288da7c9556608de620e65308efa4
。它匹配!因此,让我们将其添加到文件末尾。
$ { printf "checksum_v1 = " ; printf $(md5sum -z ~/chrome-dict | awk '{print $1}') ; } >> ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
checksum_v1 = 08f7dd79a17e12b178a1010057ef5e34$
不,校验和错误!让我们尝试 cat 以确保两个语句之间没有任何内容写入文件printf
。
$ head -n -1 .config/google-chrome/Default/Custom\ Dictionary.txt > ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
$ { printf "checksum_v1 = " ; printf $(md5sum -z ~/chrome-dict | awk '{print $1}') ; } | cat >> ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
checksum_v1 = 08f7dd79a17e12b178a1010057ef5e34$
校验和仍然错误!我们来试试 tmp 文件。
$ head -n -1 .config/google-chrome/Default/Custom\ Dictionary.txt > ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
$ { printf "checksum_v1 = " ; printf $(md5sum -z ~/chrome-dict | awk '{print $1}') ; } >> ~/chrome-dict-tmp
$ cat ~/chrome-dict-tmp >> ~/chrome-dict && rm ~/chrome-dict-tmp
$ cat ~/chrome-dict
AATEST
dotancohen
checksum_v1 = 2b7288da7c9556608de620e65308efa4$
成功了!为什么将输出重定向到文件末尾的一行代码没有~/chrome-dict
返回正确的 MD5 哈希值?
{ … } >> ~/chrome-dict
不会汇总输出,…
在一切完成后将其发送到文件,它只会让其中的工具继承相同的文件描述符。您的md5sum
工作在第一个之后printf
,因此它可以读取已附加一些文本的文件。在文件附加的所有内容
md5sum
之前运行make 。当您使用单个命令进行所有打印时,这很容易:printf
$()
现在,在开始之前,必须先退出内部,因此在读取整个文件之前附加到文件printf
没有任何风险。在您的原始代码中,只有第二个被“阻止”。printf
md5sum
printf
您
awk
可能在不完整的行和终止空字节的情况下工作得很好,但通常最好为文本工具提供正确的文本;因此我-z
在调用时放弃了md5sum
。在我们的例子中,如果awk
无论如何都可以,那么print $1
它将以相同的方式工作,并且无论如何都会删除尾随的换行符。但如果严格要求文本$()
的实现,那么只会破坏一切。awk
-z
问题:你不能这样做:
正如@Ed 指出的那样,默认情况下您不能同时读取和写入同一个文件。
解决方案:您需要
sponge
以下工具moreutils
: