module FileUtils
Constants
- LN_SUPPORTED
- RUBY
Path to the currently running Ruby program
Public Instance Methods
Run a Ruby interpreter with the given arguments.
Example:
ruby %{-pe '$_.upcase!' <README}
# File lib/rake/file_utils.rb, line 98 def ruby(*args, **options, &block) if args.length > 1 sh(RUBY, *args, **options, &block) else sh("#{RUBY} #{args.first}", **options, &block) end end
Attempt to do a normal file link, but fall back to a copy if the link fails.
# File lib/rake/file_utils.rb, line 110 def safe_ln(*args, **options) if LN_SUPPORTED[0] begin return options.empty? ? ln(*args) : ln(*args, **options) rescue StandardError, NotImplementedError LN_SUPPORTED[0] = false end end options.empty? ? cp(*args) : cp(*args, **options) end
Run the system command cmd
. If multiple arguments are given the command is run directly (without the shell, same semantics as Kernel::exec and Kernel::system).
It is recommended you use the multiple argument form over interpolating user input for both usability and security reasons. With the multiple argument form you can easily process files with spaces or other shell reserved characters in them. With the multiple argument form your rake tasks are not vulnerable to users providing an argument like ; rm # -rf /
.
If a block is given, upon command completion the block is called with an OK flag (true on a zero exit status) and a Process::Status object. Without a block a RuntimeError is raised when the command exits non-zero.
Examples:
sh 'ls -ltr' sh 'ls', 'file with spaces' # check exit status after command runs sh %{grep pattern file} do |ok, res| if !ok puts "pattern not found (status = #{res.exitstatus})" end end
# File lib/rake/file_utils.rb, line 43 def sh(*cmd, &block) options = (Hash === cmd.last) ? cmd.pop : {} shell_runner = block_given? ? block : create_shell_runner(cmd) set_verbose_option(options) verbose = options.delete :verbose noop = options.delete(:noop) || Rake::FileUtilsExt.nowrite_flag Rake.rake_output_message sh_show_command cmd if verbose unless noop res = (Hash === cmd.last) ? system(*cmd) : system(*cmd, options) status = $? status = Rake::PseudoStatus.new(1) if !res && status.nil? shell_runner.call(res, status) end end
Split a file path into individual directory names.
Example:
split_all("a/b/c") => ['a', 'b', 'c']
# File lib/rake/file_utils.rb, line 126 def split_all(path) head, tail = File.split(path) return [tail] if head == "." || tail == "/" return [head, tail] if head == "/" return split_all(head) + [tail] end