运行 bash 来自 Octave / matlab 的脚本在执行 bash 意外标记附近出现语法错误时出错 `('

running bash script from within octave / matlab getting error executing bash syntax error near unexpected token `('

我在意外标记`('

附近执行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'

请注意: 它是从 Octave 3.8.1 内部调用的数学程序,如 matlab

在 bash 命令行中使用 ' 确实允许使用像 ( 这样的保留字符而无需转义;但是,那不是你在做什么。 's 中的所有内容都将传递给 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,但我希望传达了这个想法。 " 应该有效地避开括号。唯一的陷阱是,如果您的目录名称中可能包含 $",在这种情况下,或者您的目录名称中包含 '",事情会变得愚蠢。

正如我在关于此主题的其他问题中告诉您的那样:不要使用 bash -c; octave 没有必要 运行 一个外部命令,你什么都不做,只是通过尝试让你的生活变得更艰难。

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

两个主要区别:

  • 我们正在使用由 system() 调用隐式创建的 sh -c
  • 我们正在转义文件名,以防止其中的任何恶意内容转义引号并被执行。

转义的工作原理:

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

'"'"'

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

对于 Octave 的语法,将 's 加倍到 ''s 会使这一切变得更加复杂;这就是如何得到

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

...将所有 ' 替换为 '"'"'