我使用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
你寫的東西看起來無可挑剔(很好,足夠乾淨以至於不會產生那個錯誤,無論如何)。因此,我們必須猜測,您已經執行了某些與您向我們顯示的腳本不同的內容。我建議刪除'| bash'和'sleep 60',並通過'bash -x'運行腳本的其餘部分。看看你給了什麼。 (當我在Mac上試用時,它'有效',雖然沒有'namenode'值,所以命令只有'-Z'和'-N'之間的空格。) – 2015-03-31 05:59:36
@JonathanLeffler我添加了剩餘的腳本。這是一個由廚師執行的bash腳本。我也不認爲'| bash'和'sleep 60'是原因,因爲他們之前沒有。 – cybertextron 2015-03-31 06:16:26
'| bash'和'sleep 60'都不會導致你的問題,但是在測試時,你不想意外執行'configure.sh'腳本,也不想在試圖嘗試腳本之間等待60秒。無論是「廚師」都在搞砸你,還是沒有運行你認爲正在運行的代碼。我不熟悉'廚師'。在命令行測試你的腳本(沒有bash或睡眠)。使用'bash -x yourscript.sh'來查看正在發生的事情。如果它是你展示的,你不應該得到錯誤。你是否意外地使用了一個文字處理雙引號(''''或''''而不是''')? – 2015-03-31 06:32:50