2015-03-31 448 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