我需要编写一个Ruby函数,该函数在给定变量名和应该为其赋值的情况下生成正确的Bash EXPORT语句.我目前的try 是

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"

在贝壳里给出

a\nb

而不是想要的

a
b

如果它很重要(我不期望它会发生,但以防万一),该语句将被写入一个文件中,该文件将在稍后提供来源.

推荐答案

您复制粘贴的是irb中的自动 echo 字符串,而不是所述字符串的value.自动 echo 是向您显示一个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.

Ruby相关问答推荐

Ruby插值法导致无序输出

如何使用Ruby中的时区函数S标准库?

当数据包含换行符时,Ruby PKCS7 无法验证

Ruby:一个方法可以返回不同类型的对象吗?

BasicObject 的 singleton_class 的超类如何以及为什么是 Ruby 中的 Class 类?

ruby:rubocop 抱怨将 if else 转换为 case 语句

是否有类似于 Ruby 的 Sinatra 的 .NET 框架?

ruby `encode': "\xC3" 从 ASCII-8BIT 到 UTF-8 (Encoding::UndefinedConversionError)

Ruby 中的 Monad 类似功能

创建一个哈希值作为数组和默认值作为空数组

为什么 RuboCop 建议用 Array.new 替换 .times.map?

需要必要的库和/或头文件时如何安装 ruby​​-debug

你能用 Ruby 开发原生 iPhone 应用程序吗?

在 ruby​​ 的超类中调用另一个方法

. vs ::(点与双冒号)用于调用方法

确定Ruby的位置

判断字符串是否为空的Ruby方法?

Xcode - 配置:错误:在 $PATH 中找不到可接受的 C 编译器

Ruby 中的 to_s 与 to_str(以及 to_i/to_a/to_h 与 to_int/to_ary/to_hash)

=== 与 == 在 Ruby 中