bash while 循环在第一行之后中断

问题描述 投票:0回答:3

我有一个带有 while 循环的简单脚本,但无法理解为什么它在 $vault_list 变量的第一行之后中断:

#!/bin/bash

tech_login="$1"
vault_list=$(docker exec -i tmgnt_vault_1 vault list secret/${tech_login}-terminals | sed 1,2d)

while IFS= read -r terminal
do
    echo "line is $terminal"
    key_values=$(docker exec -i tmgnt_vault_1 vault read secret/${tech_login}-terminals/$terminal )


done <<< "$vault_list"

如果我从 while 循环中删除 $key_values,它会返回 echo“line is $terminal”中的所有值。 谁能指出我, while 循环有什么问题?我认为这可能是输出问题,但不确定。

bash while-loop
3个回答
4
投票

希望这对其他人有帮助。
ssh 可能是正在使用 stdin 的命令。
这是给我的。

例如while 循环内的 ssh 导致循环在第一次迭代后退出。

LIST="cid1 10.10.0.1 host1
cid2 10.10.0.2 host1
cid3 10.10.0.3 host2"

# this while loop exits after first iteration
# ssh has eaten rest of stdin
echo "$LIST" |while read -r cid cip chost; do
    echo $cid;
    PSINFO=$(ssh $chost docker exec -i $cid "ps -e -orss=,pid=,args=,cmd=" |grep java );
    echo PSINFO=$PSINFO; 
done; 

通过指示 ssh 使用 从 /dev/null 获取标准输入来解决:

# this while loop keeps on running
# ssh directed to take stdin from /dev/null
echo "$LIST" |while read -r cid cip chost; do
    echo $cid;
    PSINFO=$(ssh $chost docker exec -i $cid "ps -e -orss=,pid=,args=,cmd=" </dev/null |grep java );
    echo PSINFO=$PSINFO; 
done; 

2
投票

根据 @choroba 的提示,我找到了 $key_values 的正确语法:

key_values=$(docker exec -i tmgnt_vault_1 vault read secret/${tech_login}-terminals/$terminal <<<$terminal)

我需要将 $terminal 变量显式传递给 docker 命令,这可以使用此处字符串“<<


0
投票

aws ecs execute-command
有同样的问题。 While 循环在第一次执行后立即被中断。不幸的是,它没有
-n
标志,但是
< /dev/null
的技巧有所帮助。

因此,为集群中的每个任务运行命令的正确方法是:

$ aws ecs list-tasks --cluster prod-cluster --service prod-service --region prod-region \
    | grep arn:aws:ecs:prod-region \
    | sed 's_.*/__g;s/[",]//g' \
    | while read task; do 
        echo $task; 
        aws ecs execute-command --cluster prod-cluster --task ${task} --container prod-image --command "uptime" --interactive < /dev/null \
            | grep 'load average'; 
    done

它将显示

uptime
当前在集群中运行的所有任务

© www.soinside.com 2019 - 2024. All rights reserved.