如何从expect脚本传递bash等效的“$@”

如何从expect脚本传递bash等效的“$@”,bash,command-line,tcl,expect,argv,Bash,Command Line,Tcl,Expect,Argv,我有一个expect脚本,它是bash脚本的包装器,它是scp的包装器: 基本上,我会这样称呼我的bash脚本 myscp host /path filenames 这将要求我在主机上输入root密码。而且,我厌倦了必须一直输入root。主机是带有ramdisk的测试机器,所以我无法在主机上设置ssh。所以我一直在玩expect,我认为它会起作用 无论如何,我可以在expect脚本中选择位置参数,如下所示: #!/usr/bin/expect -f set host [lindex $argv

我有一个expect脚本,它是bash脚本的包装器,它是scp的包装器:

基本上,我会这样称呼我的bash脚本

myscp host /path filenames
这将要求我在主机上输入root密码。而且,我厌倦了必须一直输入root。主机是带有ramdisk的测试机器,所以我无法在主机上设置ssh。所以我一直在玩expect,我认为它会起作用

无论如何,我可以在expect脚本中选择位置参数,如下所示:

#!/usr/bin/expect -f
set host [lindex $argv 0];
set path [lindex $argv 1];
#but how to get filenames??
[...]
spawn myscp $host $path $filenames
到目前为止,我已经尝试设置文件名[lrange$argv 2 end],但这只会导致一个参数包含所有带有空格分隔符的文件名

无论如何,我基本上想把$@传递给myscp。或者更不雄心勃勃,$@假设文件名中没有空格

我会怎么做呢


谢谢。

你就快到了,伙计。你只需要在繁殖前添加eval。这就足够了

#!/usr/bin/expect -f

eval spawn myscp [lrange $argv 0 end]
lrange将从第0个索引提取到最后一个索引的命令行参数,这相当于bash脚本中的$@


参考资料:&

你就快到了,伙计。你只需要在繁殖前添加eval。这就足够了

#!/usr/bin/expect -f

eval spawn myscp [lrange $argv 0 end]
lrange将从第0个索引提取到最后一个索引的命令行参数,这相当于bash脚本中的$@

参考:&

{*}语法将列表拆分为各个元素。如果您的Expect太老,无法理解这一点,那么您将不得不求助于@Dinesh的评估答案

Expect是Tcl语言的扩展,{*}语法作为

{*}语法将列表拆分为各个元素。如果您的Expect太老,无法理解这一点,那么您将不得不求助于@Dinesh的评估答案


Expect是Tcl语言的一个扩展,{*}语法被记录为

的规则5是的,我也尝试过,但没有成功。但是谢谢你的建议。我得到“eval没有这样的文件或目录”。然后我试着把bash-x放在前面,看起来更进一步,但现在我得到了所有这些调试的东西,这是不可取的,而且似乎把expect搞砸了。是的,我也试过了,但没有成功。但是谢谢你的建议。我得到“eval没有这样的文件或目录”。然后我尝试将bash-x放在前面,这似乎更进一步,但现在我得到了所有这些调试内容,这是不可取的,并且似乎把expect搞砸了。顺便说一句,我建议将其标记为tcl问题而不是bash问题,因为expect在这里使用tcl语法;了解bash并不能让人回答它。顺便说一句,我实际上建议将其标记为tcl问题,而不是bash问题,因为expect在这里使用tcl语法;了解bash并不能使人具备回答它的能力。谢谢!成功了。我会绞尽脑汁好几个小时而不想出这个解决办法。呵呵。。。你帮我省去了很多麻烦谢谢成功了。我会绞尽脑汁好几个小时而不想出这个解决办法。呵呵。。。你帮我省去了很多麻烦