Bash 命令因 bash -c 而失败,但在交互式 shell 中有效

Bash command fails with bash -c but works in an interactive shell

我有这个 相当 简单的命令,当 运行 在 bash 内时,将剩余磁盘 space 输出到 stdout:

echo -n "External1TB: $(grep -Poi '(\/mnt\/External1TB\s+)\K(.*)' <(df -H --output=target,avail))B"

我正在使用进程重定向 <()df 的输出通过管道传输到 grep,然后处理输出并过滤掉剩余的 space。所有这些都包含在 subshell $() 中并提供给 echo 因此我可以在输出前加上磁盘名称。

示例输出:External1TB: 882GB

当 运行 在交互式 bash shell 中时它工作得相当好,但是如果我尝试使用 bash -c 运行 它,就像这样:

bash -c "echo -n "External1TB: $(grep -Poi '(\/mnt\/External1TB\s+)\K(.*)' <(df -H --output=target,avail))B"",

输出总是:External1TB:。似乎 grepdf 由于某种原因失败了。

我做错了什么?

您对内部的引用需要转义:

bash -c "echo -n \"External1TB: $(grep -Poi '(\/mnt\/External1TB\s+)\K(.*)' <(df -H --output=target,avail))B\"",

或者,考虑至少将其中的一部分放入函数或脚本中,这样您就不需要在字符串转义时堆叠字符串转义。