class Launchy::Runner

Run a command in a child process

Public Instance Methods

commandline_normalize(cmdline) click to toggle source
# File lib/launchy/runner.rb, line 47
def commandline_normalize(cmdline)
  c = cmdline.flatten!
  c = c.find_all { |a| !a.nil? and a.size.positive? }
  Launchy.log "commandline_normalized => #{c.join(' ')}"
  c
end
dry_run(cmd, *args) click to toggle source
# File lib/launchy/runner.rb, line 32
def dry_run(cmd, *args)
  shell_commands(cmd, args).join(" ")
end
run(cmd, *args) click to toggle source
# File lib/launchy/runner.rb, line 8
def run(cmd, *args)
  unless cmd
    raise Launchy::CommandNotFoundError,
          "No command found to run with args '#{args.join(' ')}'. If this is unexpected, #{Launchy.bug_report_message}"
  end

  if Launchy.dry_run?
    $stdout.puts dry_run(cmd, *args)
  else
    wet_run(cmd, *args)
  end
end
shell_commands(cmd, args) click to toggle source

cut it down to just the shell commands that will be passed to exec or posix_spawn. The cmd argument is split according to shell rules and the args are not escaped because the whole set is passed to system as *args and in that case system shell escaping rules are not done.

# File lib/launchy/runner.rb, line 41
def shell_commands(cmd, args)
  cmdline = [cmd.to_s.shellsplit]
  cmdline << args.flatten.collect(&:to_s)
  commandline_normalize(cmdline)
end
wet_run(cmd, *args) click to toggle source
# File lib/launchy/runner.rb, line 21
def wet_run(cmd, *args)
  argv = [cmd, *args].flatten
  Launchy.log "ChildProcess: argv => #{argv.inspect}"
  process = ChildProcess.build(*argv)

  process.io.inherit!
  process.leader = true
  process.detach = true
  process.start
end