如何使用shell命令的输出设置expect变量

use*_*274 8 linux variables bash shell expect

我想在expect文件中设置一个变量b,这里最初我通过这个脚本ssh到一台机器,在那台机器上我想要获取一个值并使用以下命令设置expect变量:

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


send_user "$b"
Run Code Online (Sandbox Code Playgroud)

file/home/a有以下结构:

home=10.10.10.1

work=10.20.10.1
Run Code Online (Sandbox Code Playgroud)

我打算在打印后使用变量b但是在执行ssh脚本之后它会给出:

不能读"2":没有这样的变量

while executing
Run Code Online (Sandbox Code Playgroud)

如果我将此输出放在该机器的文件名temp中并尝试执行以下操作:

设置b [exec cat ./temp]

然后它还给出了:

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

如果我发送"cat ./temp",它会输出正确的输出.

请让我知道我哪里出错了.

Din*_*esh 6

单引号不是引用机制Tcl,所以支撑你的awk表达式.

% set b [exec cat /home/a | grep "work" | awk -F {=} {{print $2}}]
10.20.10.1
Run Code Online (Sandbox Code Playgroud)

参考: Tcl中经常犯的错误


gle*_*man 5

假设您产生了一个 ssh 会话或类似的东西,send "cat ./temp\r"向您显示远程主机上的文件,并向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"
Run Code Online (Sandbox Code Playgroud)