如何正确引用此bash管道进行监视?

时间:2013-05-06 20:58:22

标签: linux bash unix

我已经建立了这个管道:

echo "scale=2;$(cat io | grep wchar | awk '{print $2}')/(1024^3)" | bc

现在我正在尝试watch它。我对Bash的了解非常特别,所以我没有成功。尝试过这样的事情:

watch echo "scale=2;$(cat io | grep wchar | awk '{print $2}')/(1024^3)" | bc # I understand why this fails

watch 'echo "scale=2;$(cat io | grep wchar | awk '{print $2}')/(1024^3)" | bc' # Not enough bash understanding to understand why this fails

我做错了什么?

修改

cat io的示例输出

rchar: 36713294562
wchar: 36788363400
syscr: 27050
syscw: 2314540
read_bytes: 36709928960
write_bytes: 0
cancelled_write_bytes: 0

2 个答案:

答案 0 :(得分:3)

尝试让watch调用shell:

watch sh -c 'echo "scale=2;$(awk '/wchar/ {print $2}' io)/(1024^3)" | bc'

这类似于调用脚本但不需要单独的文件。

答案 1 :(得分:3)

问题是关于awk的单引号,你可以通过转义单引号来修复它。

watch 'echo "scale=2;$(cat io | grep wchar | awk '"'"'{print $2}'"'"')/(1024^3)" | bc'

关于如何在单引号内转义单引号,有一个很好的解释"BASH, escaping single-quotes inside of single-quoted strings"