这是this topic的延续;因为这是与OP不同的问题我正在制作一个新主题。我有一个期望脚本我无法工作,应该从文件中读取命令并执行它们。这是脚本本身,称为script.sh
:
#!/usr/bin/expect
set prompt {\$\s*$}
set f [open "script_cmds_u.txt"]
set cmds [split [read $f] "\n"]
close $f
foreach cmd $cmds {
spawn $cmd
expect -re $prompt
}
expect eof
close
文件script_cmds.txt如下所示:
mkdir cmdlisttest1
mkdir cmdlisttest2
要运行我使用的脚本
tr -d '\r' < testpswd2.sh > testpswd2_u.sh
tr -d '\r' < script_cmds.txt > script_cmds_u.txt
chmod +x testpswd2_u.sh
./testpswd2_u.sh
这样做我收到以下错误:couldn't execute "mkdir cmdlisttest1": no such file or directory
。
所以我尝试了一些改变:
send $cmd
。这会将输出更改为mkdir cmdlisttest1couldn't compile regular expression pattern: invalid escape \ sequence
。我也会在\n
中的命令之后使用\r
和script_cmds.txt
尝试此操作。expect -re $prompt
。然后我得到mkdir cmdlisttest1mkdir cmdlisttest2
并挂起。在spawn "\n"
之后加send $cmd
;然后我得到
mkdir cmdlisttest1spawn
couldn't execute "
": no such file or directory
答案 0 :(得分:4)
错误是由于spawn
将整个字符串(例如:mkdir cmdlisttest1
)作为不带参数的命令。
请尝试使用argument expansion(感谢@glenn jackman):
foreach cmd $cmds {
spawn {*}$cmd
expect -re $prompt
}
另一种选择:
foreach cmd $cmds {
spawn [lindex $cmd 0] [lrange $cmd 1 [llength $cmd]]
expect -re $prompt
}
使用[lindex $cmd 0]
,您将获得 mkdir ;
使用[lrange $cmd 1 [llength $cmd]]
,参数(例如 cmdlisttest1 )。
lindex
列表索引
从列表中返回索引的第#项。注意:列表从0开始,而不是1,因此第一项是索引0,第二项是索引1,依此类推。
lrange
列出最后一个
返回由列表中的第一个到最后一个条目组成的列表。如果first小于或等于0,则将其视为第一个列表元素。 如果last为end或值大于列表中元素的数量,则将其视为结束。如果first大于last,则返回空列表。