linux - 运行 Vagrant SSH 会导致 BASH 循环提前终止

标签 linux bash shell ssh vagrant

<分区>

我有一个 bash 脚本,可以获取正在运行的 selenium 节点,获取它们的 ID,并通过 SSH 连接到它们以执行配置任务。

#!/bin/bash

# retrieve list of running vagrant machines, filter them to selenium nodes, and
# process provisioning for each
vagrant global-status --prune | grep "selenium_node" | while read -ra line ; do
    echo -e "\033[32mBEGININNG ${line[1]} PROVISIONING\033[37m"

    # adding this statement causes the loop to exit after 1 iteration
    vagrant ssh ${line[0]} -- "
        echo 'it runs'
    "

    echo -e "\033[32mEND ${line[1]} PROVISION\033[37m"
done

我的问题是运行 vagrant ssh 会导致循环在第一次迭代后终止。我通过删除“vagrant ssh”确认了这一点,结果是 BEGINNINGEND echo 命令在每次迭代中都成功运行(在我的例子中 - 两次迭代)。

奇怪的是,循环确实完成了它的第一次迭代(如 END 回显行完成所证明),它只是没有运行任何进一步的迭代。

此外,我已经确认它不仅仅是忽略显示其他迭代的输出。它从不在其他机器上执行任何操作。

最佳答案

ssh - 包括 vagrant ssh - 使用标准输入,所以如果你在 while read 循环中运行它,它不会离开下一次循环迭代要读取的任何内容。

您可以通过告诉 ssh 不要读取标准输入 (ssh -n) 或使用与 while read 不同的结构来解决这个问题>。在这种情况下,由于 vagrant ssh 不支持 -n 选项,我建议运行它时将其输入从 /dev/null 重定向:

</dev/null vagrant ssh ${line[0]} -- "
    echo 'it runs'
"

关于linux - 运行 Vagrant SSH 会导致 BASH 循环提前终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35586713/

相关文章:

linux - mod_wsgi-express start-server 的反义词是什么

linux - 杀死除一个 python 脚本和 grep 进程之外的所有 python 脚本

bash - 如何获取通过管道传输到 Bash 中另一个进程的进程的 PID?

bash - 在命令之间转义管道输出

shell - Makefiles : how to get a file name for a rule target from outside, 以可移植的方式

vba - 将 VBA 中执行的 Shell 命令的输出通过管道传送到特定 Shell

linux - 不同操作系统上的 tensorflow 训练和测试

linux - 在 Docker 容器中使用 GNU Mailutils 发送邮件

python - 将子进程通过管道传递到 Linux 中的文件

linux - 如何在 csv 文件 unix 中循环变量值以忽略它们?