awk中的escape shell重定向字符

时间:2013-12-05 14:40:37

标签: bash shell redirect awk escaping

有人有“明亮”的想法,你应该可以在任何地方使用输出重定向。

这意味着这两个是等价的:

# echo expect > more friends
# cat more
expect friends
# rm more

# echo expect friends > more
# cat more
expect friends
# rm more

这不会那么糟糕,如果你可以逃脱它,事实上你可以:

# echo "expect > more friends"
expect > more friends

# echo 'expect > more friends'
expect > more friends

实际上,你甚至可以写出这样的东西,它会按预期工作:

# echo '{ print $1 > 10 }'
{ print $1 > 10 }

现在让我们尝试使用awk:

# echo 5 | awk '{ print $1 > 10 }'
# cat 10
5
# rm 10

当然。现在,如果有人能告诉我这有什么意义......

但是让我们尝试其他变种:

# echo 5 | awk "{ print $1 > 10 }"
# cat 10
5
# rm 10

# echo 5 | awk '{ print $1 \> 10 }'
awk: 1: unexpected character '\'

# echo 5 | awk '{ print $1 \\> 10 }'
awk: 1: unexpected character '\'

为什么要打击?为什么呢?

在任何情况下,都有一个解决方法,使用<而不是>完全应该做的事情:

# echo 5 | awk '{ print 10 < $1 }'
0

但是,为什么呢?

1 个答案:

答案 0 :(得分:2)

这与bash无关。 awk不执行bash代码,因此print ... > file是纯awk命令,因此适用不同的转义规则。

没有相应的输入重定向运算符,因此print $1 < 10只是被解析为打印比较结果的命令$1 < 10