2017-03-11 5 views
0

をコマンドを実行して、私は読むラインとそれに

gcloud compute instances list --format=json --regexp .*gluster.* | jq '.[].networkInterfaces[].networkIP' | tr -d '\"' | while read i; do gcloud compute ssh --zone $ZONE [email protected] -- "sudo gluster peer probe $i && cat >> peers.txt"; done 

を動作するように、次のコマンドを取得しようとしている。基本的のgcloudコマンドが得られます。しかし、上記のコマンドを実行している

gcloud compute instances list --format=json --regexp .*gluster.* | jq '.[].networkInterfaces[].networkIP' | tr -d '\"' 
10.128.0.2 
10.128.0.3 
10.128.0.4 

にのみ提供します

peer probe: success. Probe on localhost not needed 

他のどのノードもホストの最初のIPでのみ実行されているようです接続される。

注: 変なふうには2番目のノードでのgcloudコマンドを実行している最初の1に接続し、第三上で実行されているすべての

第三除くすべてのノード上のpeers.txtファイルで何もしません再び不気味2つのだけ後者のIPS

[email protected]:~$ cat peers.txt 
10.128.0.3 
10.128.0.4 

は、ループ内の値でエコーを実行するには、

gcloud compute instances list --format=json --regexp .*gluster.* | jq '.[].networkInterfaces[].networkIP' | tr -d '\"' | while read i; do echo ip: $i; done 
ip: 10.128.0.2 
ip: 10.128.0.3 
ip: 10.128.0.4 
+0

gcloudにはjqの多くの機能が組み込まれています。以下は同じ結果を返す 'gcloud計算インスタンスリスト--format ="値(networkInterfaces.networkIP) "--filter =" name〜gluster "' – cherba

答えて

0

は、それが動作するようになった与えていますforループを使用します。

はまた、(あなたが現在で実行するループの本体を必要としないと仮定したループへの配管と間違って何もありませんforループ:)

for item in $(gcloud compute instances list --format=json --regexp .*gluster.* | jq '.[].networkInterfaces[].networkIP' | tr -d '\"'); do gcloud compute ssh --zone $ZONE [email protected] -- "sudo gluster peer probe $item && echo $item >> peers.txt"; done 
3

に配管のためではないことを学びましたシェル)。あなたはこのようなもののためにforループを使いたくはありません。詳細については、Bash FAQ 001を参照してください。 whileループを使用してください。

gcloud compute instances list --format=json --regexp .*gluster.* | 
    jq -r '.[].networkInterfaces[].networkIP' | 
    while IFS= read -r ipaddr; do 
    echo "$ipaddr" 
    done 

jq-rオプションを使用すると、二重引用符を削除するtrにパイプへの必要性に出力を排除することに注意してください。)

あなたが見てすることができる問題は、コマンドを使用すると、中に入れたということですwhileループ標準入力から読み込み、readが読む前にパイプラインからデータを消費します。

gcloud compute instances list --format=json --regexp .*gluster.* | 
    jq -r '.[].networkInterfaces[].networkIP' | 
    while IFS= read -r i; do 
     gcloud compute ssh --zone $ZONE [email protected] \ 
     -- "sudo gluster peer probe $i < /dev/null && 
     cat >> peers.txt" 
    done 

または、別のファイル記述子からの読み取りにプロセス置換を使用します。その場合は、あなたが/dev/nullから標準入力をリダイレクトすることができます。

while IFS= read -r i <&3; do 
    gcloud ... 
done 3< <(gcloud compute instances .. | jq -r '...') 
関連する問題