我有一个包装脚本,用于编译命令以计算已执行命令的md5sum并对其进行计时(也有一些东西)。关键是我必须在包装脚本中计算 md5sum。
问题是 M5sum 为gcc main.c
和gcc "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.c
和gcc "main.c"
是同一个命令。 两种变体中的$0 = gcc
和$1 = main.c
。
你无法在内部看到差异,脚本也无法做出不同的符号,所以你没有理由看到这一点。