Expect - 存在双破折号时生成

时间:2013-10-17 01:46:30

标签: bash scripting escaping tcl expect

首先承认我是一个脚本noob,但基本上我遇到麻烦产生一个期待会话,当我试图运行的命令有双破折号。即如下:

#!/usr/bin/expect -f
set command "mysqlimport -h mysql.someserver.amazonaws.com -P 3306 -u root --fields-enclosed-by=\"|\" -p myDBHere --local /var/www/csvuploads/tablename "
spawn {*}$command
expect "password:"
send -- "mypassword\r"

我收到错误说:

mysqlimport: Error: 1083, Field separator argument is not what is expected; check the manual, when using table: INT_BRN_BRAND

现在我想我知道发生了什么。我认为双冲刺被生成器拾取然后mysqlimport没有得到它的字段分隔符设置..这与你在发送后放置“ - ”的原因相同。我相信这告诉TCL或Expect,给定命令没有更多选项。

真正的问题

那么如何生成一个具有 - flags?

的进程

我尝试过的事情

在产卵后添加双短划线。 使用\ u002d转义命令文本中的破折号 使用autoexpect生成脚本来执行我想要的操作。 而不是产生mysqlimport我试图产生一个新的bash shell并“发送 - ”命令。我接近但遇到了一系列不同的问题。

2 个答案:

答案 0 :(得分:1)

尝试使用花括号围绕双短划线。这告诉TCL将它们传递给spawn命令而不进行扩展。

#!/usr/bin/expect -f

spawn ls {--all} /tmp
interact

有关详细信息,请参阅http://jazimmer.com/tclbook/select/Html/2.5.html

答案 1 :(得分:0)

虽然spawn命令有自己的选项,但它们都不是--。它只处理选项,直到遇到非选项,并且可执行文件几乎从不以-开始其名称。你的官方问题是偏离目标的;这不是你遇到的问题。

您的实际问题几乎可以肯定:--fields-enclosed-by=\"|\"。你真的想最终得到一个包含字段的多字符序列吗?我猜不是。 mysqlimport是否支持多字符封装序列?我猜不是(如果确实如此,会感到惊讶)。我也猜测--fields-enclosed-by=|就足够了。与unix shell不同,启动子进程的Tcl命令(包括execspawn,即使后者由扩展提供)也不要将|解释为特殊,除非它是一个它自己的论点(或作为非常小的其他选项列表的一部分,这里没有一个适用)。

如果更改$command是不切实际的,最简单的方法是使用unix shell通过使用不同的方式调用spawn来解释它:

spawn /bin/sh -c $command

不要担心开始额外的过程。与任何数据库导入相比,它们都很便宜。