我想通过 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 命令出了什么问题呢?它是如何破坏管道的?一些有线退出代码?
建议:为什么不为每个命令使用临时文件?
Message() {
tmpfiles=()
for arg in "$@"; do
tmp="$(mktemp)"
tmpfiles+=("$tmp")
ssh localhost "echo $arg" > "$tmp" &
done
wait
cat "${tmpfiles[@]}"
rm "${tmpfiles[@]}"
}