在octave/matlab中运行bash脚本时出错在意外标记“%x27”附近执行bash语法错误;
我在意外标记“(”附近执行bash语法错误时出错 我知道错误是由“”)”引起的,但我认为将命令放在“”之间应该允许在目录名中插入括号。如何在不重命名名称的情况下修复此问题 matlab/倍频程代码为:在octave/matlab中运行bash脚本时出错在意外标记“%x27”附近执行bash语法错误;,bash,matlab,shell,octave,Bash,Matlab,Shell,Octave,我在意外标记“(”附近执行bash语法错误时出错 我知道错误是由“”)”引起的,但我认为将命令放在“”之间应该允许在目录名中插入括号。如何在不重命名名称的情况下修复此问题 matlab/倍频程代码为: syscmd=strcat({'bash -c '},{''''},{'cd '},dirpathpls,newdirname,{' && exec bash xfade.sh'},{''''}) %used to run script to join files in stret
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内部调用的,在bash命令行中使用matlab这样的数学程序,允许使用保留字符,如
(
而不转义;但是,这不是您正在做的事情。中的所有内容都将传递给bash进行解释,bash不会将'
作为命令的一部分进行解释。类似这样的操作应该可以:
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。唯一的陷阱是如果你的目录名中可能有一个$
或”
,或者你有“
和“
以你的dir的名义,事情会变得愚蠢。正如我在你关于这个主题的另一个问题中告诉你的:不要使用bash-c
;octave没有必要运行外部命令,你什么也不做,只是通过尝试让你的生活更加艰难
command=strcat({'cd '''},
strrep(strcat(dirpathpls,newdirname),
'''',
'''"''"'''''),
{''' && exec bash xfade.sh'})
system(syscmd);
两个关键区别:
- 我们正在使用system()调用隐式创建的
sh-c
- 我们正在转义文件名,防止其中的任何恶意内容转义引号并被执行
逃逸的工作原理: POSIX Shell中的单引号字符串仅以以下单引号结束。要在其中插入文字单引号,需要结束单引号字符串,然后输入不同的引号类型。因此:
'"'"'
…其中第一个“
结束前面的引用类型;”
进入双引号上下文(在该上下文中可以识别单引号文本;”
之后是您的文本单引号字符;”
以下内容结束双引号上下文,最后一个“
恢复单引号上下文
对于八度音阶的语法,将'
s加倍到'
s,这一切都变得更加复杂;这就是我们得到的结果
strrep(content, '''', '''"''"''''')
…将所有
'
替换为''''“
s.好多了。如果你第一次在问题中包含了这一点……也就是说,到目前为止,你唯一的答案有很大的安全风险。如果目录名包含任何用户提供的数据,请小心使用它。另外——我关于摆脱bash-c
的回答?它仍然适用于这里。系统(“foo”)
call调用sh-c'foo'
;因为没有特定于bash的语法,sh
shell对于您的用例来说已经足够好了,您没有任何理由通过调用内部bash
来复杂化引用/转义。如果使用的任何一个参数都可以包含用户提供的数据,这是非常危险的。这是错误的对内部引号使用'
非常安全,并转义在数据中找到的任何实例——例如,在dirpathpls
或newdirname
中用'
替换'
。也就是说,在系统()中使用bash-c
call--system()
调用隐式地位于sh-c
的上下文中,因此bash-c
只不过是冗余的低效率。