试图在bash脚本中使用管道。这在我的Linux上工作得很好,但是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.发布于 2021-06-12 13:53:03
在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。
发布于 2021-06-12 13:38:55
bash内置exec命令有一个完全不同的目标,如https://www.computerhope.com/unix/bash/exec.htm中所解释的那样。
为了让脚本工作,或者像@Jonathan在评论中建议的那样,您必须用exec代替eval,您可以使用bash -c "$cmd"。
https://stackoverflow.com/questions/67949305
复制相似问题