在Unix中,将2个命令的输出连接在同一行中

gstyhher  于 2022-11-04  发布在  Unix
关注(0)|答案(4)|浏览(221)

我有一个命令像下面

md5sum test1.txt | cut -f 1 -d " " >> test.txt

我希望上面结果的输出带有前缀File_CheckSum:
预期输出:File_CheckSum: <checksumvalue>
我尝试了以下方法

echo 'File_Checksum:' >> test.txt | md5sum test.txt | cut -f 1 -d " " >> test.txt

但得到结果是

File_Checksum:
adbch345wjlfjsafhals

我希望整个输出在一行中

File_Checksum: adbch345wjlfjsafhals
mbskvtky

mbskvtky1#

echo在完成参数写入后会写入一个换行符。某些版本的echo允许使用-n选项来抑制换行符,但最好使用printf
您可以使用命令组来连接两个命令的标准输出:

{ printf 'File_Checksum: '; md5sum test.txt | cut -f 1 -d " "; } >> test.txt

请注意,此处存在争用条件:理论上,您可以在md5sum完成阅读之前写入test.txt,从而导致校验和超过预期的数据。(您的原始命令提到test1.txttest.txt是单独的文件,因此不清楚您是否真的在读取和写入同一个文件。)

jmo0nnb3

jmo0nnb32#

您可以使用命令分组将命令列表作为一个单元执行,并立即重定向组的输出:

{ printf 'File_Checksum: ';  md5sum test1.txt | cut -f 1 -d " " } >> test.txt
sr4lhrrt

sr4lhrrt3#

printf "%s: %s\n" "File_Checksum:" "$(md5sum < test1.txt | cut ...)" > test.txt

请注意,如果您试图计算test.txt(您试图写入的同一个文件)的哈希值,这会使情况发生很大变化。
另一个选项是:

{
    printf "File_Checksum: "
    md5sum ...
} > test.txt

或者:

exec > test.txt
printf "File_Checksum: "
md5sum ...

但请注意,所有后续命令也会将其输出写入test.txt。恢复stdout的典型方法是:

exec 3>&1
exec > test.txt # Redirect all subsequent commands to `test.txt`
printf "File_Checksum: "
md5sum ...
exec >&3  # Restore original stdout
jaxagkaj

jaxagkaj4#

运算符&&,例如mkdir example && cd example

相关问题