linux - 从expect/tcl 向perl 脚本传递多个参数

标签 linux perl tcl expect

我在使用下面的脚本时遇到了一些问题。

proc checkUser {userip} {
    set search "show users | include "
    set search_cmd [concat $search $userip]
    exp_send "$search_cmd\r"

    expect {
        -re "Vi.*" {

            set oui "uei.opennms.org/services/passiveServiceStatus"
            set host "localhost"
            set iface "--interface $userip"
            set service "--service Test"
            set parm1 "--parm 'passiveNodeLabel [getNodeName $userip]'"
            set parm2 "--parm 'passiveIpAddr $userip'"
            set parm3 "--parm 'passiveServiceName Test'" 
            set parm4 "--parm 'passiveStatus Up'"

            send_user [ exec perl /opt/opennms/bin/send-event.pl $oui,$host,$iface,$service,$parm1,$parm2,$parm3,$parm4 ]
            #send_user [ exec [pwd]]

        }
    }
}

整个 Expect 脚本执行时没有错误,但是调用的 perl 脚本似乎没有执行,但是当我使用相同的参数在 bash 中运行 perl 脚本时,它会执行它应该执行的操作。

这是从 Expect 中调用 perl 脚本的正确方法吗?

提前致谢。

最佳答案

编写的程序会将参数作为一个大参数传递给 Perl 脚本,各个参数之间用逗号分隔。虽然这通常是合法的,但这可能不是 Perl 程序想要的!相反,在中间放置空格,以便这些值是 Tcl 级别的单独参数,并且它们也将成为 Perl 级别的单独命令行参数:

exec perl /opt/opennms/bin/send-event.pl $oui $host $iface $service $parm1 $parm2 $parm3 $parm4

此外,似乎每个 Tcl 变量都有多个参数,并且您试图在其中使用 shell 引用。这更加错误。你最好像这样编写代码:

expect {
    -re "Vi.*" {
        set oui "uei.opennms.org/services/passiveServiceStatus"
        set host "localhost"

        send_user [ exec perl /opt/opennms/bin/send-event.pl $oui $host \
                --interface $userip \
                --service "Test" \
                --parm "passiveNodeLabel [getNodeName $userip]" \
                --parm "passiveIpAddr $userip" \
                --parm "passiveServiceName Test" \
                --parm "passiveStatus Up" ]
    }
}

每个参数字在 Tcl 中都是它自己的字;我添加了反斜杠换行符以使事情更清晰。我们使用双引号,以便它们可以在处理替换的同时嵌入空格,但如果您需要一些奇怪的东西,请放入 {braces} 或使用反斜杠。

关于linux - 从expect/tcl 向perl 脚本传递多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14211942/

相关文章:

c - 从多线程应用程序生成进程

mysql - MariaDB 10 CentOS 7 移动数据目录问题

tcl lsort 对字符串中的最后 n 个字符

cygwin - TCL/TCLSH 没有该文件或目录

linux - PERL sh : script_init: command not found

perl - 跨多列排序 (Perl)

PHP 套接字还是 Python、Perl、Bash 套接字?

Python在if语句中使用正则表达式匹配对象,然后像Perl一样访问捕获组

TCL - 将 STDIN 提供给执行程序

c - 是什么导致此链接失败( undefined reference )?