1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Improve the document of Shellwords

- Improve careless examples
  - Insert `--` before a file name for cat(1)
  - Insert `-e` before a search pattern for grep(1)

- Add a caution about passing an arbitrary argument to a command
This commit is contained in:
Akinori MUSHA 2020-06-16 23:15:51 +09:00
parent 318d52e820
commit 68e4310344

View file

@ -24,28 +24,37 @@
# argv = "see how they run".shellsplit # argv = "see how they run".shellsplit
# argv #=> ["see", "how", "they", "run"] # argv #=> ["see", "how", "they", "run"]
# #
# Be careful you don't leave a quote unmatched. # They treat quotes as special characters, so an unmatched quote will
# cause an ArgumentError.
# #
# argv = "they all ran after the farmer's wife".shellsplit # argv = "they all ran after the farmer's wife".shellsplit
# #=> ArgumentError: Unmatched double quote: ... # #=> ArgumentError: Unmatched double quote: ...
# #
# In this case, you might want to use Shellwords.escape, or its alias # Shellwords also provides methods that do the opposite.
# String#shellescape. # Shellwords.escape, or its alias, String#shellescape, escapes
# shell metacharacters in a string for use in a command line.
# #
# This method will escape the String for you to safely use with a Bourne shell. # filename = "special's.txt"
# #
# argv = Shellwords.escape("special's.txt") # system("cat -- #{filename.shellescape}")
# argv #=> "special\\'s.txt" # # runs "cat -- special\\'s.txt"
# system("cat " + argv) #
# Note the '--'. Without it, cat(1) will treat the following argument
# as a command line option if it starts with '-'. It is guaranteed
# that Shellwords.escape converts a string to a form that a Bourne
# shell will parse back to the original string, but it is the
# programmer's responsibility to make sure that passing an arbitrary
# argument to a command does no harm.
# #
# Shellwords also comes with a core extension for Array, Array#shelljoin. # Shellwords also comes with a core extension for Array, Array#shelljoin.
# #
# argv = %w{ls -lta lib} # dir = "Funny GIFs"
# system(argv.shelljoin) # argv = %W[ls -lta -- #{dir}]
# system(argv.shelljoin + " | less")
# # runs "ls -lta -- Funny\\ GIFs | less"
# #
# You can use this method to create an escaped string out of an array of tokens # You can use this method to build a complete command line out of an
# separated by a space. In this example we used the literal shortcut for # array of arguments.
# Array.new.
# #
# === Authors # === Authors
# * Wakou Aoyama # * Wakou Aoyama
@ -123,7 +132,7 @@ module Shellwords
# #
# # Search files in lib for method definitions # # Search files in lib for method definitions
# pattern = "^[ \t]*def " # pattern = "^[ \t]*def "
# open("| grep -Ern #{pattern.shellescape} lib") { |grep| # open("| grep -Ern -e #{pattern.shellescape} lib") { |grep|
# grep.each_line { |line| # grep.each_line { |line|
# file, lineno, matched_line = line.split(':', 3) # file, lineno, matched_line = line.split(':', 3)
# # ... # # ...