与命令替换一起使用时 /usr/bin/find 调用不起作用

与命令替换一起使用时 /usr/bin/find 调用不起作用

在脚本中,我有:

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

相关内容