【发布时间】:2021-06-12 13:26:55
【问题描述】:
尝试在 bash 脚本中使用管道。这在我的 Linux shell 上运行良好,但 bash 脚本出错了。我做错了什么?
#!/bin/bash
#some code
cmd="cat file2 | grep ':' | awk -F \":\" '{print \$1}' > pool_names"
echo $cmd
exec $cmd
我看到了这个错误
cat: invalid option -- 'F'
Try 'cat --help' for more information.
【问题讨论】:
-
它不是这样工作的——你需要使用
eval "$cmd"将管道评估为管道而不是字符串,但是使用eval是非常危险的。您也可以使用bash -c "$cmd",但这相当于eval。我保留在eval "$cmd"中使用引号错误的权利(也许应该是eval $cmd),但使用eval仍然不安全。 -
澄清一下,您正在调用
cat,参数为file2、|、grep、:、|、awk、-F等。cat将前 6 个参数视为文件名(或者,如果它达到那么远,它会),但不将-F识别为有效选项,因此它正在中止。 -
你很幸运;
cat | grep | awk是一种反模式,您可以轻松地完全避开管道。