假设我们需要将一些参数传递给shell命令.(让我们假设一个Bourne兼容shell.)
例如,假设我们要He said "It's a boy"; sure使用echo(1)打印字符串.
当然,我们不能这样做:
s = [[He said "It's a boy"; sure]]
os.execute("echo " .. s)
Run Code Online (Sandbox Code Playgroud)
但以下工作正常:
s = [[He said "It's a boy"; sure]]
os.execute(("echo %q"):format(s))
Run Code Online (Sandbox Code Playgroud)
我的问题:您认为使用%q引用shell参数是否足够好?
我已经知道%q如果我们的参数包含换行符(它将转换为斜杠+换行符,这意味着shell将看不到任何字符;但至少它不会破坏命令)并不是很好.这是针对我们的一个案例.还有其他情况%q会让我们失望吗?
来自 5.1 的参考手册:
字符串写在双引号之间,所有双引号、换行符、内嵌零和反斜杠在写入时都正确转义
假设这是正确的,这些是唯一将被转义的字符。在您的情况下,shell 可以识别特殊字符,例如;, 不在此列表中,因此不会对其进行转义。但%q有效,因为它用引号将字符串括起来,所以;被隐藏了。此外,这意味着生成一个 Lua 可以读取的字符串。因此,在引号、反斜杠等中添加转义字符不一定是命令 shell 理解命令所需要的。我认为很难确定是否%q会一直做你想做的事,对于任何外壳。