如何将包含换行符(可能还有其他特殊字符)的Ruby字符串转义为有效的shell变量值?

jjhzyzn0  于 2023-06-29  发布在  Ruby
关注(0)|答案(1)|浏览(135)

我需要写一个Ruby函数,它在给定变量名和应该赋值的值的情况下生成一个正确的Bash导出语句。我目前的尝试是

def export(variable, string)
  "export #{variable}=#{Shellwords.escape(string)}"
end

然而,它的表现并不像我期望的那样。例如

[2] pry(main)> export("X", "a\nb")
"export X=a'\n'b"

然后

export X=a'\n'b
echo "$X"

在 shell 中给出

a\nb

而不是期望的

a
b

如果有关系的话(我不希望有关系,但以防万一),语句将被写入一个文件,稍后将被引用。

ltqd579y

ltqd579y1#

您复制粘贴的是irb中自动回显的字符串,而不是该字符串的 value。自动回显显示了一个Ruby字符串文字,其中保留了Ruby转义符,所以你得到:

irb(main)> Shellwords.shellescape("a\nb")
=> "a'\n'b"

如果你打印了这个字符串(例如使用puts)来获取其原始值(转义符被打印为它们的真实的字符),例如

irb(main)> puts Shellwords.shellescape("a\nb")
a'
'b
=> nil

然后复制粘贴成:

export X=a'
'b
echo "$X"

它会工作得很好。
类似地,将"export X=#{Shellwords.escape(string)}"写入文件(通过puts或其他实际的I/O API写入字符串的值,而不是其表示)以供以后使用也可以正常工作,因为这将插入字符串的值,并且文件将以单引号之间的原始换行符结束,而不是\n

相关问题