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:
。似乎 grep
或 df
由于某种原因失败了。
我做错了什么?
您对内部的引用需要转义:
bash -c "echo -n \"External1TB: $(grep -Poi '(\/mnt\/External1TB\s+)\K(.*)' <(df -H --output=target,avail))B\"",
或者,考虑至少将其中的一部分放入函数或脚本中,这样您就不需要在字符串转义时堆叠字符串转义。
我有这个 相当 简单的命令,当 运行 在 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:
。似乎 grep
或 df
由于某种原因失败了。
我做错了什么?
您对内部的引用需要转义:
bash -c "echo -n \"External1TB: $(grep -Poi '(\/mnt\/External1TB\s+)\K(.*)' <(df -H --output=target,avail))B\"",
或者,考虑至少将其中的一部分放入函数或脚本中,这样您就不需要在字符串转义时堆叠字符串转义。