0

首先承认我是一个脚本菜鸟,但基本上当我尝试运行的命令有双破折号时,我无法生成一个期望会话。即如下:

#!/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 给定命令没有更多选项。

真正的问题

那么如何产生一个具有 -- 标志的进程呢?

我尝试过的事情

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

4

2 回答 2

1

尝试用花括号包围双破折号。这告诉 TCL 将它们传递给 spawn 命令而不进行扩展。

#!/usr/bin/expect -f

spawn ls {--all} /tmp
interact

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

于 2013-10-17T03:23:26.613 回答
0

尽管该spawn命令有自己的选项,但它们都不是--. 它只处理选项,直到遇到非选项,并且可执行文件几乎从不以-. 您的官方问题偏离目标;这不是你遇到的问题。

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

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

spawn /bin/sh -c $command

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

于 2013-10-17T08:44:17.590 回答