Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在octave/matlab中运行bash脚本时出错在意外标记“%x27”附近执行bash语法错误;_Bash_Matlab_Shell_Octave - Fatal编程技术网

在octave/matlab中运行bash脚本时出错在意外标记“%x27”附近执行bash语法错误;

在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

我在意外标记“(”附近执行bash语法错误时出错

我知道错误是由“”)”引起的,但我认为将命令放在“之间应该允许在目录名中插入括号。如何在不重命名名称的情况下修复此问题

matlab/倍频程代码为:

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
只不过是冗余的低效率。