如何理解以下输出?
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
我正在使用以下预期代码:
#!/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