从octave / matlab中运行bash脚本获取错误,在意外令牌附近执行bash语法错误`(''

时间:2015-04-21 19:28:05

标签: bash matlab shell octave

我发现错误在意外令牌附近执行bash语法错误`('

我知道错误是由')引起的,但我认为将命令放在'之间。 ' 假设允许目录名中的括号。如何在不重命名的情况下解决此问题?

matlab / octave代码是:

syscmd=strcat({'bash -c '},{''''},{'cd '},dirpathpls,newdirname,{' && exec bash xfade.sh'},{''''}) %used to run script to join files in stretch directory
system(syscmd);

它产生以下内容:

bash -c 'cd /tmp/h1/clients/04212015142432811_Fs_1000_ahh/pls/03sox_a_Fs_1000_ahh_(000_bit)_(0.0000
0sig_in_deg)_to_(508_bit)_(30.00000sig_in_deg) && exec bash xfade.sh'

请注意: 它是从八度音阶3.8.1中调用的一个像matlab这样的数学程序

2 个答案:

答案 0 :(得分:2)

在bash命令行中使用'允许使用(等保留字符而不转义;然而,这不是你在做什么。你'中的所有内容都被传递给bash进行解释,bash并没有将' s解释为命令的一部分。这样的事情应该有效:

syscmd=strcat({'bash -c '},{''''},{'cd "'},dirpathpls,newdirname,{'" && exec bash xfade.sh'},{''''}) %used to run script to join files in stretch directory
system(syscmd);

我不知道matlab / octave,但我希望传达这个想法。 "应该有效地逃脱了parens。唯一的缺陷是,如果您的目录名称中包含$",或者您的目录名称中包含' AND ",那么会变得很傻。

答案 1 :(得分:0)

正如我在您关于此主题的其他问题中告诉您的:不要使用bash -c;八度音阶没有必要运行一个外部命令,你只是通过尝试让你的生活更加艰难。

command=strcat({'cd '''},
           strrep(strcat(dirpathpls,newdirname),
                  '''',
                  '''"''"'''''),
           {''' && exec bash xfade.sh'})
system(syscmd);

两个主要区别:

  • 我们正在使用system()调用
  • 隐式创建的sh -c
  • 我们正在逃避文件名,防止其中的任何恶意内容泄露报价并被执行。

逃脱的运作方式:

POSIX shell中的单引号字符串仅以下面的单引号结束。要在其中插入文字单引号,需要结束单引号字符串,然后输入不同的引用类型。因此:

'"'"'

...其中第一个'结束先前的引用类型; "输入双引号上下文(其中可以识别单引号文字; '后面是您的文字单引号字符;后面的"结束双引号上下文,最终'恢复单引号上下文。

对于Octave的语法,将'加倍到'',这一切都变得更加复杂;这是一个人得到的方式

strrep(content, '''', '''"''"''''')

...用' s替换所有'"'"'