![与命令替换一起使用时 /usr/bin/find 调用不起作用](https://linux22.com/image/86514/%E4%B8%8E%E5%91%BD%E4%BB%A4%E6%9B%BF%E6%8D%A2%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%E6%97%B6%20%2Fusr%2Fbin%2Ffind%20%E8%B0%83%E7%94%A8%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
在脚本中,我有:
CMD='/usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; '
MD5=$("${CMD}")
但脚本给出了错误:
-bash: /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; : No such file or directory
但是,当在命令行逐字输入时, $CMD 的内容会起作用,即
/usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;
正确生成 md5 哈希值列表。
我已经尝试了我能想到的一切,包括转义字符串中的反斜杠和分号,但似乎无法让它工作。
我还尝试使用反引号调用该命令,这不会改变结果。
我究竟做错了什么 ?
答案1
单引号之间的整个字符串(包括空格)被寻找为 bash 执行的二进制文件/脚本,与错误指示的完全相同。即,这不会尝试/usr/bin/find
以它尝试开始的参数开始/usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;
。
答案2
您在双引号内使用了,因此未执行"${CMD}"
扩展的结果$CMD
场分裂(并且文件名扩展),整个字符串/usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;
被视为要运行的命令。没有这样命名的命令,因此 shell 报告没有这样的文件或目录错误。
因为您使用bash
,所以最好使用数组:
$ CMD=( /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \; )
$ "${CMD[@]}"
或 POSIXly,使用"$@"
:
$ set -- /usr/bin/find /etc -type f -exec /usr/bin/md5sum {} \;
$ "$@"
在第一种情况下,您可以$CMD
不使用双引号,但它是不推荐,容易失败。至少set -f
在跑步之前你需要这样做$CMD
。