问题描述
这是的续篇;因为它是一个不同的问题从OP我正在做一个新的话题。我有一个期望脚本我不能得到工作,应该从一个文件中读取命令并执行它们。这是脚本本身,称为 script.sh
:
This is a continuation of this topic; since it's a different question from the OP I'm making a new topic. I have an expect script I can't get working that is supposed to read commands from a file and execute them. This is the script itself, called 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像这样:
The file script_cmds.txt looks like this:
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
这样做我得到以下错误:无法执行mkdir cmdlisttest1:没有这样的文件或目录
。
Doing it like this I get the following error: couldn't execute "mkdir cmdlisttest1": no such file or directory
.
所以我尝试了一些变化:
So I try a number of changes:
- 将它改为
send $ cmd
在循环中。这会将输出更改为mkdir cmdlisttest1couldn't compile正则表达式模式:invalid escape \ sequence
。我还可以在script_cmds中的命令之后使用
。\\\
和
\r
txt - 在循环中删除
expect -re $ prompt
。然后我得到mkdir cmdlisttest1mkdir cmdlisttest2
,它挂在那里。 -
放一个
send $ cmd
后面的然后我得到
Change it to
send $cmd
in the loop. This changes the output tomkdir cmdlisttest1couldn't compile regular expression pattern: invalid escape \ sequence
. I also try this with\n
and\r
after the commands inscript_cmds.txt
.Remove the
expect -re $prompt
in the loop. Then I getmkdir cmdlisttest1mkdir cmdlisttest2
and it hangs there.Put a
spawn "\n"
after thesend $cmd
; then I get
mkdir cmdlisttest1spawn
无法执行
:无此类文件或目录
推荐答案
错误是由于
将不带参数的整个字符串(例如: mkdir cmdlisttest1
)作为命令。
The error is due to
spawn
is taking the whole string (e.g.: mkdir cmdlisttest1
) as a command without arguments.
改用(感谢):
foreach cmd $cmds {
spawn {*}$cmd
expect -re $prompt
}
另一种选择:
Another option:
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 )。
With [lindex $cmd 0]
you'll get mkdir;
With [lrange $cmd 1 [llength $cmd]]
, the arguments (e.g. cmdlisttest1).
最后列表
返回由列表中第一个到最后一个条目组成的列表。如果first小于或等于0,则将其视为第一个列表元素。 如果last是end或大于列表中元素数量的值,则将其视为结束。如果first大于last,则返回空列表。
lrange
list first last
Returns a list composed of the first through last entries in the list. If first is less than or equal to 0, it is treated as the first list element. If last is end or a value greater than the number of elements in the list, it is treated as the end. If first is greater than last then an empty list is returned.
这篇关于Expect脚本不能从文件中读取mkdir并执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!