首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Shellwords

操作像UNIX Bourne shell这样的字符串

此模块根据UNIX Bourne shell的单词分析规则处理字符串。

shellwords()函数最初是shellwords.pl的一个端口,但被修改为符合IEEE Std 1003.1-2008,2016年版1的Shell&Utilities卷。

用法

您可以使用Shellwords将字符串解析为Bourne shell友好的数组。

代码语言:javascript
复制
require 'shellwords'

argv = Shellwords.split('three blind "mice"')
argv #=> ["three", "blind", "mice"]

一旦你需要Shellwords,你可以使用拆分别名String#shellsplit。

代码语言:javascript
复制
argv = "see how they run".shellsplit
argv #=> ["see", "how", "they", "run"]

注意不要留下不匹配的引用。

代码语言:javascript
复制
argv = "they all ran after the farmer's wife".shellsplit
     #=> ArgumentError: Unmatched double quote: ...

在这种情况下,您可能想要使用:: escape或其别名String#shellescape。

此方法会转义字符串,以供您安全地使用Bourne shell。

代码语言:javascript
复制
argv = Shellwords.escape("special's.txt")
argv #=> "special\\'s.txt"
system("cat " + argv)

Shellwords还附带Array,Array#shelljoin的核心扩展。

代码语言:javascript
复制
argv = %w{ls -lta lib}
system(argv.shelljoin)

您可以使用此方法从由空格分隔的令牌数组中创建转义字符串。在这个例子中,我们使用了Array.new的文字快捷键。

公共类方法

escape(str)

别名为:shellescape

join(array)

别名为:shelljoin

shellescape(str) Show source

转义字符串以便它可以安全地在Bourne shell命令行中使用。 str可以是一个响应to_s的非字符串对象。

请注意,结果字符串应该不加引号使用,不适用于双引号或单引号。

代码语言:javascript
复制
argv = Shellwords.escape("It's better to give than to receive")
argv #=> "It\\'s\\ better\\ to\\ give\\ than\\ to\\ receive"

String#shellescape是此函数的简写。

代码语言:javascript
复制
argv = "It's better to give than to receive".shellescape
argv #=> "It\\'s\\ better\\ to\\ give\\ than\\ to\\ receive"

# Search files in lib for method definitions
pattern = "^[ \t]*def "
open("| grep -Ern #{pattern.shellescape} lib") { |grep|
  grep.each_line { |line|
    file, lineno, matched_line = line.split(':', 3)
    # ...
  }
}

调用者有责任将字符串编码为使用此字符串的shell环境的正确编码。

多字节字符被视为多字节字符,而不是字节。

如果str长度为零,则返回一个空的带引号的字符串。

代码语言:javascript
复制
# File lib/shellwords.rb, line 138
def shellescape(str)
  str = str.to_s

  # An empty argument will be skipped, so return empty quotes.
  return "''".dup if str.empty?

  str = str.dup

  # Treat multibyte characters as is.  It is the caller's responsibility
  # to encode the string in the right encoding for the shell
  # environment.
  str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/, "\\\\\\1")

  # A LF cannot be escaped with a backslash because a backslash + LF
  # combo is regarded as a line continuation and simply ignored.
  str.gsub!(/\n/, "'\n'")

  return str
end

另外别名为:escape

shelljoin(array) Show source

从参数列表构建命令行字符串,array

所有元素都加入到一个字符串中,并用空格分隔字段,其中每个元素都为Bourne shell转义并使用to_s进行字符串化。

代码语言:javascript
复制
ary = ["There's", "a", "time", "and", "place", "for", "everything"]
argv = Shellwords.join(ary)
argv #=> "There\\'s a time and place for everything"

Array#shelljoin是此函数的快捷方式。

代码语言:javascript
复制
ary = ["Don't", "rock", "the", "boat"]
argv = ary.shelljoin
argv #=> "Don\\'t rock the boat"

您还可以在Array#join中允许的元素中混合非字符串对象。

代码语言:javascript
复制
output = %x`#{['ps', '-p', $$].shelljoin}`
代码语言:javascript
复制
# File lib/shellwords.rb, line 184
def shelljoin(array)
  array.map { |arg| shellescape(arg) }.join(' ')
end

还有别名:连接

shellsplit(line) Show source

按照与UNIX Bourne shell相同的方式将字符串拆分为一组令牌。

代码语言:javascript
复制
argv = Shellwords.split('here are "two words"')
argv #=> ["here", "are", "two words"]

但请注意,这不是命令行解析器。除单引号和双引号以及反斜杠以外的Shell元字符不会被视为这样。

代码语言:javascript
复制
argv = Shellwords.split('ruby my_prog.rb | less')
argv #=> ["ruby", "my_prog.rb", "|", "less"]

String#shellsplit是此函数的快捷方式。

代码语言:javascript
复制
argv = 'here are "two words"'.shellsplit
argv #=> ["here", "are", "two words"]
代码语言:javascript
复制
# File lib/shellwords.rb, line 78
def shellsplit(line)
  words = []
  field = String.new
  line.scan(/\G\s*(?>([^\s\\\"]+)|'([^\]*)'|"((?:[^\"\]|\.)*)"|(\.?)|(\S))(\s|\z)?/m) do
    |word, sq, dq, esc, garbage, sep|
    raise ArgumentError, "Unmatched double quote: #{line.inspect}" if garbage
    # 2.2.3 Double-Quotes:
    #
    #   The <backslash> shall retain its special meaning as an
    #   escape character only when followed by one of the following
    #   characters when considered special:
    #
    #   $ ` " \ <newline>
    field << (word || sq || (dq && dq.gsub(/\([$`"\\n])/, '\1')) || esc.gsub(/\(.)/, '\1'))
    if sep
      words << field
      field = String.new
    end
  end
  words
end

还有别名:shellwords,split

shellwords(line)

别名为:shellsplit

split(line)

别名为:shellsplit

私有实例方法

shellescape(str) Show source

转义字符串以便它可以安全地在Bourne shell命令行中使用。 str可以是一个响应to_s的非字符串对象。

请注意,结果字符串应该不加引号使用,不适用于双引号或单引号。

代码语言:javascript
复制
argv = Shellwords.escape("It's better to give than to receive")
argv #=> "It\\'s\\ better\\ to\\ give\\ than\\ to\\ receive"

String#shellescape是此函数的简写。

代码语言:javascript
复制
argv = "It's better to give than to receive".shellescape
argv #=> "It\\'s\\ better\\ to\\ give\\ than\\ to\\ receive"

# Search files in lib for method definitions
pattern = "^[ \t]*def "
open("| grep -Ern #{pattern.shellescape} lib") { |grep|
  grep.each_line { |line|
    file, lineno, matched_line = line.split(':', 3)
    # ...
  }
}

调用者有责任将字符串编码为使用此字符串的shell环境的正确编码。

多字节字符被视为多字节字符,而不是字节。

如果str长度为零,则返回一个空的带引号的字符串。

代码语言:javascript
复制
# File lib/shellwords.rb, line 138
def shellescape(str)
  str = str.to_s

  # An empty argument will be skipped, so return empty quotes.
  return "''".dup if str.empty?

  str = str.dup

  # Treat multibyte characters as is.  It is the caller's responsibility
  # to encode the string in the right encoding for the shell
  # environment.
  str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/, "\\\\\\1")

  # A LF cannot be escaped with a backslash because a backslash + LF
  # combo is regarded as a line continuation and simply ignored.
  str.gsub!(/\n/, "'\n'")

  return str
end

另外别名为:escape

shelljoin(array) Show source

从参数列表构建命令行字符串,array

所有元素都加入到一个字符串中,并用空格分隔字段,其中每个元素都为Bourne shell转义并使用to_s进行字符串化。

代码语言:javascript
复制
ary = ["There's", "a", "time", "and", "place", "for", "everything"]
argv = Shellwords.join(ary)
argv #=> "There\\'s a time and place for everything"

Array#shelljoin是此函数的快捷方式。

代码语言:javascript
复制
ary = ["Don't", "rock", "the", "boat"]
argv = ary.shelljoin
argv #=> "Don\\'t rock the boat"

您还可以在Array#join中允许的元素中混合非字符串对象。

代码语言:javascript
复制
output = %x`#{['ps', '-p', $$].shelljoin}`
代码语言:javascript
复制
# File lib/shellwords.rb, line 184
def shelljoin(array)
  array.map { |arg| shellescape(arg) }.join(' ')
end

还有别名:join

shellsplit(line) Show source

按照与UNIX Bourne shell相同的方式将字符串拆分为一组令牌。

代码语言:javascript
复制
argv = Shellwords.split('here are "two words"')
argv #=> ["here", "are", "two words"]

但请注意,这不是命令行解析器。除单引号和双引号以及反斜杠以外的Shell元字符不会被视为这样。

代码语言:javascript
复制
argv = Shellwords.split('ruby my_prog.rb | less')
argv #=> ["ruby", "my_prog.rb", "|", "less"]

String#shellsplit是此函数的快捷方式。

代码语言:javascript
复制
argv = 'here are "two words"'.shellsplit
argv #=> ["here", "are", "two words"]
代码语言:javascript
复制
# File lib/shellwords.rb, line 78
def shellsplit(line)
  words = []
  field = String.new
  line.scan(/\G\s*(?>([^\s\\\"]+)|'([^\]*)'|"((?:[^\"\]|\.)*)"|(\.?)|(\S))(\s|\z)?/m) do
    |word, sq, dq, esc, garbage, sep|
    raise ArgumentError, "Unmatched double quote: #{line.inspect}" if garbage
    # 2.2.3 Double-Quotes:
    #
    #   The <backslash> shall retain its special meaning as an
    #   escape character only when followed by one of the following
    #   characters when considered special:
    #
    #   $ ` " \ <newline>
    field << (word || sq || (dq && dq.gsub(/\([$`"\\n])/, '\1')) || esc.gsub(/\(.)/, '\1'))
    if sep
      words << field
      field = String.new
    end
  end
  words
end

还有别名:shellwords,split

shellwords(line)

别名为:shellsplit

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com