调试 bash 脚本以同时运行远程 ssh 命令

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

我想通过 ssh 启动远程命令并简单地显示输出。

我的问题不是如何去做。已经有很多好的答案了。

我的问题是:为什么我的尝试不起作用以及如何调试它。 所以这主要是关于bash语法的问题。

动机是: 如果并行运行多个远程命令,输出可能会出现乱码。所以我的想法是通过一个大管道运行所有请求。每个阶段执行一个远程命令并将其输出传送到下一个阶段。每个阶段最后都使用

cat
附加上一阶段的输出。

为了获得一个易于理解的示例,远程命令只是一个

echo
,而远程主机始终是
localhost

#!/bin/bash

Message () {
    if [ $# -gt 0 ]
    then
        local Arg1=$1
        shift

        # execute other commands in parallel
        Message "$@" | (
            # a very simple remote command
            ssh localhost "echo $Arg1"

            # append the output of previous commands
            cat
        )
    fi
}

Message The quick brown fox jumps over the lazy dog

运行此脚本仅返回参数的子集。 使用

bash -x
显示它已执行,但某些输出未推送到管道中。

但是:用简单的

ssh localhost "echo $Arg1"
替换
echo $Arg1
效果非常好。

那么 ssh 命令出了什么问题呢?它是如何破坏管道的?一些有线退出代码?

bash ssh pipe
1个回答
0
投票

建议:为什么不为每个命令使用临时文件?

Message() {
    tmpfiles=()

    for arg in "$@"; do
       tmp="$(mktemp)"
       tmpfiles+=("$tmp")
       ssh localhost "echo $arg" > "$tmp" &
    done

    wait
    cat "${tmpfiles[@]}"
    rm "${tmpfiles[@]}"
}
© www.soinside.com 2019 - 2024. All rights reserved.