2

假设我有一个简单的expect脚本 ( simple.exp):

set command "ls -l somedir"
spawn $command
interact

执行此脚本会导致错误,因为expect将 ls -l(带有空格的整个字符串)视为命令而不是 ls 作为命令和 -l 作为选项:

expect -f simple.exp
spawn ls -l
couldn't execute "ls -l somedir": no such file or directory
     while executing
"spawn $command"
     (file "simple.exp" line 2)

我想要的是类似于首先bash处理字符串并将其分解为不同的参数以启动命令的行为:

bash -c "ls -l somedir"

请注意,command为简单起见,变量在脚本中是硬编码的。在实际脚本中,它作为参数(任意命令行字符串)提供。

4

4 回答 4

3

解决方案的提示在这个问题的答案中(expect使用tcl语言):

set command "ls -l somedir"
spawn {*}$command
interact

{*}语法将以下字符串拆分为空格分隔的单词。

于 2013-04-06T17:05:01.037 回答
2

最安全的命令是使用Tcl' list命令。例如:

#!/usr/bin/expect
set cmd [list ls -l "a b c.txt"]
if { [package vcompare $tcl_version 8.5] < 0 } {
    eval spawn -noecho $cmd
} else {
    spawn -noecho {*}$cmd
}
expect eof
于 2013-04-07T04:45:59.183 回答
0

这行得通。

#!/usr/bin/expect

set command "ls"
set parameter "-la"
set prompt ":~"
spawn $command $parameter
expect $prompt
于 2013-04-06T07:50:38.440 回答
0

如果您有一个 bash 字符串变量用作期望脚本的参数,您可以尝试使用 lrange:

set command [lrange $argv x y]

其中 x 和 y 是字符串变量中参数的开始和结束。
例如:
如果您的字符串变量是

myvariable="hello how are you?"

并且您正在像这样使用它:

./shellscript $myvariable

那么您的期望脚本行将如下所示

set command [lrange $argv 0 3]

您可以在期望脚本中的任何位置使用 $command。它将根据需要包含空格。

于 2014-09-22T07:23:07.347 回答