首先承认我是一个脚本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并“发送 - ”命令。我接近但遇到了一系列不同的问题。
答案 0 :(得分:1)
尝试使用花括号围绕双短划线。这告诉TCL将它们传递给spawn命令而不进行扩展。
#!/usr/bin/expect -f
spawn ls {--all} /tmp
interact
答案 1 :(得分:0)
虽然spawn
命令有自己的选项,但它们都不是--
。它只处理选项,直到遇到非选项,并且可执行文件几乎从不以-
开始其名称。你的官方问题是偏离目标的;这不是你遇到的问题。
您的实际问题几乎可以肯定:--fields-enclosed-by=\"|\"
。你真的想最终得到一个包含字段的多字符序列吗?我猜不是。 mysqlimport
是否支持多字符封装序列?我猜不是(如果确实如此,会感到惊讶)。我也猜测--fields-enclosed-by=|
就足够了。与unix shell不同,启动子进程的Tcl命令(包括exec
和spawn
,即使后者由扩展提供)也不要将|
解释为特殊,除非它是一个它自己的论点(或作为非常小的其他选项列表的一部分,这里没有一个适用)。
如果更改$command
是不切实际的,最简单的方法是使用unix shell通过使用不同的方式调用spawn
来解释它:
spawn /bin/sh -c $command
不要担心开始额外的过程。与任何数据库导入相比,它们都很便宜。