如何理解以下输出?

How to understand the following output?

我正在使用以下预期代码:

#!/usr/bin/expect  
set string [lindex $argv 0]
send ${string}
send_user "$argv0 [lrange $argv 0 2]\n"

我 运行 这个脚本是这样的:

newProves/expect$ expect arg.exp "THIS IS THE FIRST ARG  "

我得到以下输出:

THIS IS THE FIRST ARG  arg.exp {THIS IS THE FIRST ARG  }

我在文档中读到 expect 有一个存储 args 的列表,但我的问题是为什么如果我将 argv0 设置为字符串:"THIS IS THE FIRST ARG ",那么在输出中打印:

arg.exp {THIS IS THE FIRST ARG  }

这让我觉得 argv0 仍然是脚本的默认名称,我想感谢对此的任何解释,以及 expect 的 args 列表是如何组成的。

您没有在脚本的任何地方设置 argv0

Expect 将它设置为您的脚本名称。

您可以在 expect -d 输出中看到:

$ cat arg.exp
#!/usr/bin/expect
set string [lindex $argv 0]
send ${string}
send_user "$argv0 [lrange $argv 0 2]\n"
$ expect -d arg.exp "THIS IS THE FIRST ARG "
expect version 5.45
argv[0] = expect  argv[1] = -d  argv[2] = arg.exp  argv[3] = THIS IS THE FIRST ARG
set argc 1
set argv0 "arg.exp"   # <-- This line sets `argv0` for expect.
set argv "{THIS IS THE FIRST ARG }"
executing commands from command file arg.exp
send: sending "THIS IS THE FIRST ARG " to { exp0 THIS IS THE FIRST ARG }
arg.exp {THIS IS THE FIRST ARG }

来自字符串化列表的额外大括号。 lrange命令returns一个列表。该列表的第一个元素是一个包含空格的字符串,因此当该列表被字符串化时,Tcl 将将该元素括在大括号中:

% set argv [list "This is the first arg   " second_arg_with_no_whitespace]
% puts "hello [lrange $argv 0 end]"
hello {This is the first arg   } second_arg_with_no_whitespace

解决方案是自己将该列表转换为字符串:

% puts "hello [join [lrange $argv 0 end] " "]"
hello This is the first arg    second_arg_with_no_whitespace