Bash shell脚本,如何在命令中使用管道



尝试在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,因此用一堆参数调用execexec并不试图将参数解释为shell运算符(也许您打算使用eval而不是exec(,而是将所有参数传递给cat

相关内容

  • 没有找到相关文章

最新更新