2015-03-31 440 views
1

我使用awk来解析/etc/hosts并产生一个命令,它将为我设置格式MapR。它在bash效用正在做的Chef用awk产生一个bash命令给失控的字符串常量 - awk

egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \ 
     | awk 'NR==1{ips=$1} 
       NR>1{ips=ips ", " $1} 
       $2=="namenode"{nn=$1} 
       END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb\n", ips, nn}' \ 
     | bash 
    sleep 60 

上面的命令应执行以下命令:

/opt/mapr/server/configure.sh -C 10.32.237.251 -Z 10.32.237.251 -N mycluster --create-user -D /dev/xvdb 

然而,寻找到我的chef输出我看到:

==> namenode: Executing awk utility 
==> namenode: awk: line 1: runaway string constant "/opt/mapr/ ... 

该命令从来没有在MapR节点执行...但是,当我直接在终端上执行它,它很好地工作它应该是这样的。我究竟做错了什么? 我更新的问题,以显示完整的bash脚本执行该实用程序:

DISK_CONFIG=/home/ubuntu/disk_config 
if [ -f $DISK_CONFIG ]; 
then 
    echo "File already exists" 
else 
    echo "Executing awk utility\n" 
    touch $DISK_CONFIG 
    egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \ 
     | awk 'NR==1{ips=$1} 
       NR>1{ips=ips ", " $1} 
       $2=="namenode"{nn=$1} 
       END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb\n", ips, nn}' \ 
     | bash 
    sleep 60 
fi 
+2

你写的东西看起来无可挑剔(很好,足够干净以至于不会产生那个错误,无论如何)。因此,我们必须猜测,您已经执行了某些与您向我们显示的脚本不同的内容。我建议删除'| bash'和'sleep 60',并通过'bash -x'运行脚本的其余部分。看看你给了什么。 (当我在Mac上试用时,它'有效',虽然没有'namenode'值,所以命令只有'-Z'和'-N'之间的空格。) – 2015-03-31 05:59:36

+0

@JonathanLeffler我添加了剩余的脚本。这是一个由厨师执行的bash脚本。我也不认为'| bash'和'sleep 60'是原因,因为他们之前没有。 – cybertextron 2015-03-31 06:16:26

+1

'| bash'和'sleep 60'都不会导致你的问题,但是在测试时,你不想意外执行'configure.sh'脚本,也不想在试图尝试脚本之间等待60秒。无论是“厨师”都在搞砸你,还是没有运行你认为正在运行的代码。我不熟悉'厨师'。在命令行测试你的脚本(没有bash或睡眠)。使用'bash -x yourscript.sh'来查看正在发生的事情。如果它是你展示的,你不应该得到错误。你是否意外地使用了一个文字处理双引号(''''或''''而不是''')? – 2015-03-31 06:32:50

回答

2

假设你正在使用定界符语法在bash的资源:

bash "whatever" do 
    code <<-EOH 
    DISK_CONFIG=/tmp/disk_config 
    if [ -f $DISK_CONFIG ]; 
    then 
     echo "File already exists" 
    else 
     echo "Executing awk utility\n" 
     touch $DISK_CONFIG 
     egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \ 
      | awk 'NR==1{ips=$1} 
        NR>1{ips=ips ", " $1} 
        $2=="namenode"{nn=$1} 
        END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb\n", ips, nn}' \ 
      | bash 
    fi 
    EOH 
end 

这个导致你错误:

Executing awk utility 

awk: line 4: runaway string constant "/opt/mapr/ ... 

这是由于您的COMAND成\ n(一进awk命令很可能是有问题的太)

这种资源应该做的(警告我做了更换为我的测试DISK_CONFIG路径):

bash "whatever" do 
    code <<-EOH 
    DISK_CONFIG=/tmp/disk_config 
    if [ -f $DISK_CONFIG ]; 
    then 
     echo "File already exists" 
    else 
     echo "Executing awk utility" 
     touch $DISK_CONFIG 
     egrep '^[0-9]' /etc/hosts | grep -v 127.0.0.1 \ 
      | awk 'NR==1{ips=$1} 
       NR>1{ips=ips ", " $1} 
       $2=="namenode"{nn=$1} 
       END{ printf "/opt/mapr/server/configure.sh -C %s -Z %s -N mycluster --create-user -D /dev/xvdb", ips, nn}' \ 
      | bash 
     sleep 60 
    fi 
    EOH 
end 

的原因是,厨师已经解释在代码中\n等AWK看到一个字符串上房(失控)。

当你管到bash时,你可以省略\n,因为管道将结束这条线。

+1

读者注意:如果您使用'<< - word' heredoc表单,请确保'word'前面有** tab字符来结束文档。 – 2015-03-31 10:25:52

+0

@glennjackman这是heredoc的参考资料,但是在ruby中有任何数量的空间作品,只要结尾的单词是独立的。 (并且在开始单词前没有'-',结束单词必须在行首,我们完成了我认为的警告;))。 – Tensibai 2015-03-31 10:33:47

+0

啊,很高兴知道 – 2015-03-31 10:40:08