运行 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, '''', '''"''"''''')
...将所有 '
替换为 '"'"'
。
我在意外标记`('
附近执行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, '''', '''"''"''''')
...将所有 '
替换为 '"'"'
。