尝试在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.
bash内置exec
命令有一个完全不同的目标,如https://www.computerhope.com/unix/bash/exec.htm。
您必须用eval
替换exec
才能使脚本正常工作,或者,正如@Jonathan Leffler在评论中建议的那样,您可以使用bash -c "$cmd"
。
在shell中;简单命令";是可选变量分配和重定向的序列,在任何序列中,可选地后面跟着单词和重定向,由控制运算符终止。(请参见https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01),而管道是由控制运算符"|"分隔的一个或多个命令的序列(https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_02)。当shell看到行exec $cmd
时,它看不到控制操作符|
,所以这是一个简单的命令。(这与exec
无关,任何命令都会发生相同的行为。(然后它展开行中的变量,并遵循规则the first field shall be considered the command name and remaining fields are the arguments for the command
,因此用一堆参数调用exec
。exec
并不试图将参数解释为shell运算符(也许您打算使用eval
而不是exec
(,而是将所有参数传递给cat
。