【问题标题】:how to set an expect variable with output of shell command如何使用 shell 命令的输出设置期望变量
【发布时间】:2016-03-13 09:42:26
【问题描述】:

我想在期望文件中设置一个变量 b,这里最初我通过这个脚本对一台机器进行了 ssh,在该机器上我想获取一个值并使用以下命令设置期望变量:

set b [exec `cat /home/a |grep "work"|awk -F '=' '{print $2}'`]


send_user "$b"

文件 /home/a 具有以下结构:

home=10.10.10.1

work=10.20.10.1

我在打印后尝试使用变量 b 但在执行 ssh 脚本后,它给出了:

无法读取“2”:没有这样的变量

while executing

如果我将此输出放在该机器的文件名 temp 中并尝试这样做:

set b [exec cat ./temp]

然后它也给出:

cat: ./temp: 没有这样的文件或目录

如果我发送“cat ./temp”,它会打印正确的输出。

请告诉我哪里出错了。

【问题讨论】:

    标签: linux bash shell variables expect


    【解决方案1】:

    单引号不是Tcl 的引用机制,因此请支持awk 表达式。

    % set b [exec cat /home/a | grep "work" | awk -F {=} {{print $2}}]
    10.20.10.1
    

    参考:Frequently Made Mistakes in Tcl

    【讨论】:

    • 如果我使用 :set b [exec cat /home/a |grep "work"|awk -F {=} {{print $2}}]...它会在关闭后给出额外的字符-执行时引用,如果我输入 \"work\" cat: invalid option -- 'F' 尝试 'cat --help' 获取更多信息。执行时
    【解决方案2】:

    假设您生成了一个 ssh 会话或类似的东西,send "cat ./temp\r" 会向您显示 remote 主机上的文件,exec cat ./temp 会向您显示 本地 上的文件> 主持人。 exec 是一个普通的 Tcl 命令。

    捕获send 命令的命令输出有点 PITA,因为您必须从输出中解析出实际命令和下一个提示。您需要执行以下操作:

    # don't need 3 commands when 1 can do all the work
    send {awk -F= '/work/ {print $2}' /home/a}
    send "\r"
    expect -re "awk\[^\n]+\n(.+)\r\n$PROMPT"   # where "$PROMPT" is a regex that
                                               # matches your shell prompt.
    
    set command_output $expect_out(1,string)
    send_user "$command_output\n"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2017-04-20
      • 2018-01-01
      • 2014-05-26
      相关资源
      最近更新 更多