Bash Expect-出现双破折号时生成

Bash Expect-出现双破折号时生成,bash,scripting,escaping,tcl,expect,Bash,Scripting,Escaping,Tcl,Expect,首先,我承认我是一个编写脚本的noob,但基本上,当我试图运行的命令有双破折号时,我很难生成expect会话。具体如下: #!/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 {*}$comm

首先,我承认我是一个编写脚本的noob,但基本上,当我试图运行的命令有双破折号时,我很难生成expect会话。具体如下:

#!/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
现在我想我知道发生了什么。我认为双破折号被spawn拾取,然后mysqlimport没有设置字段分隔符。。这和你在发送后加“-”的原因是一样的。我相信这会告诉TCL,或者期望给定命令没有更多选项

真正的问题

那么,如何生成一个具有--flags的进程呢

我尝试过的事情

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

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

#!/usr/bin/expect -f

spawn ls {--all} /tmp
interact

有关详细信息,请参见。

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

您的实际问题几乎肯定是这样的:
——字段由=\“\\”
括起。您真的想以包含字段的多字符序列结束吗?我猜不是。
mysqlimport
是否支持多字符外壳序列?我猜不会(如果会的话,我会感到惊讶)。我还猜测,
——用=|
括起来的字段就足够了。与unixshell不同,启动子进程的Tcl命令(包括
exec
spawn
,尽管后者是由扩展提供的)不会将
|
解释为特殊的,除非它是它自己的参数(或者作为其他选项的一小部分,这里没有一个适用)

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

spawn /bin/sh -c $command

不要担心启动额外的进程。与任何数据库导入相比,它们都是便宜的。

请注意,默认情况下,问题本身会从屏幕上向右滚动……您好,Donal,您的回答是正确的mysqlimport-h mysql.someserver.amazonaws.com-p 3306-u root--bash中由=“|”—p myDBHere--local/var/www/csvuploads/tablename括起的字段,与mysqlimport-h mysql.someserver.amazonaws.com-P 3306-u root一样工作正常--字段用=|-P myDBHere-local/var/www/csvuploads/tablename括起来--这很有用,是我实际问的问题的正确答案…但似乎我问错了问题。谢谢你,艾瑞德!