有一个更好的方法吗? BASH

时间:2013-08-23 14:15:58

标签: linux bash

ssh -p 10551 -S /tmp/manpagemaker/ssh.connect -MfN root@192.168.1.25

for xe in ${XECOMMANDS[@]} ;do

    xe=$(echo ${xe#*-}) ; xe=$(echo ${xe%.*})
    ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh "$xe"

done

有更好的方法吗?我觉得我的方法非常低效。

我编写了一个脚本,为手册页构建asciidoc模板。我正在编写xap命令的manpages,它是xapi的一部分。 “manpagemaker.sh”脚本依赖于正确执行的xe命令,该命令存在于我的远程xenserver云上。

因此,不是为我需要运行的每个manpagemaker实例打开一个新的ssh连接,我是否可以使用命名管道并将其流式传输到我的xenserver云?请记住,我最后需要添加一个重定向来捕获发送到stdout的所有文本。

1 个答案:

答案 0 :(得分:0)

您可以尝试将函数传递给xargs:

showCommands() {
    for xe in ${XECOMMANDS[@]}; do
        xe=$(echo ${xe#*-}) ; xe=$(echo ${xe%.*})
        echo "$xe"
    done
}

showCommands | xargs -l1 ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh

我不知道XECOMMANDS的内容,但似乎这个代码在文件名包含空格字符的情况下被破坏了。这是一种解决方法:

showCommands() {
    for xe in "${XECOMMANDS[@]}";do
        echo -n "$xe"
        echo -ne '\0'
    done
}

showCommands | xargs -0 -l1 ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh

-l1表示xargs将逐行读取管道输入。

由于文件名不能包含null character,因此我使用\0来分割参数。

如果要将多个参数传递给ssh,则必须将-l增加1并添加另一个回声输出。这是一个例子:

showCommands() {
    for xe in "${XECOMMANDS[@]}";do
        echo -n "$xe"
        echo -ne '\0'
        echo -n 'This is another parameter'
        echo -ne '\0'
    done
}

showCommands | xargs -0 -l2 ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh