如何在 bash 中计算已执行命令的 md5sum



我有一个包装脚本,用于编译命令以计算已执行命令的md5sum并对其进行计时(也有一些东西)。关键是我必须在包装脚本中计算 md5sum。

问题是 M5sum 为gcc main.cgcc "main.c"返回相同的输出,但命令不同。

这是简单的代码。

$ cat sc.sh
#!/usr/bin/env bash
cmd="$@"
cmdh=$(echo "$cmd" | md5sum - | cut -f1 -d" ")
echo "CMD ${cmd}"
echo "MD5 ${cmdh}"
time $@

下面是一个输出:

$ ./sc.sh gcc -c main.c -o out
CMD gcc -c main.c -o out
MD5 b671a0f3b1235aa91e5f86011449c698
real    0m0.019s
user    0m0.009s
sys     0m0.010s

这是第二个。我想要不同的md5sum。

$ ./sc.sh gcc -c "main.c" -o out
CMD gcc -c main.c -o out
MD5 b671a0f3b1235aa91e5f86011449c698
real    0m0.017s
user    0m0.007s
sys     0m0.011s

像这里:

$ echo 'gcc -c "main.c" -o out' | md5sum - | cut -f1 -d" "
94d2bafbec690940d1b908678e9c9b7d
$ echo 'gcc -c main.c -o out' | md5sum - | cut -f1 -d" "
b671a0f3b1235aa91e5f86011449c698

bash可以这样的事情吗?不将其绑定到任何特定的 bash 版本会很棒,但如果别无选择,那么它也很好。

在解析在终端中键入的行时删除引号是 shell 工作方式的一部分。您键入的命令是相同的。研究壳的工作原理,并重新研究壳牌报价的基本介绍。

像这里:

然后"像这里一样"传递它。显然,您的命令中缺少'引号,但它们存在于"像这里"代码段中。

$ ./sc.sh gcc -c main.c -o out

$ ./sc.sh gcc -c "main.c" -o out

$ ./sc.sh 'g''c''c' "-""c" 'main.c' '''''-o' 'ou't

它恰好以与以下内容相同的方式工作,只是因为您的IFS以及您如何使用="$@".研究$@做什么并研究IFS

$ ./sc.sh 'gcc -c main.c -o out'

但以下命令不同 - 保留单引号内的双引号。

$ ./sc.sh 'gcc -c "main.c" -o out'

作为后续,研究分词。请记住使用 https://shellcheck.net 检查您的脚本

脚本内部gcc main.cgcc "main.c"是同一个命令。 两种变体中的$0 = gcc$1 = main.c

你无法在内部看到差异,脚本也无法做出不同的符号,所以你没有理由看到这一点。

最新更新