Module: Kernel
- Defined in:
- lib/qbash.rb
Overview
Execute one bash command.
- Author
-
Yegor Bugayenko (yegor256@gmail.com)
- Copyright
-
Copyright © 2024 Yegor Bugayenko
- License
-
MIT
Instance Method Summary collapse
-
#qbash(cmd, stdin: '', env: {}, log: Loog::NULL, accept: [0], both: false) ⇒ String
Execute a single bash command.
Instance Method Details
#qbash(cmd, stdin: '', env: {}, log: Loog::NULL, accept: [0], both: false) ⇒ String
Execute a single bash command.
If exit code is not zero, an exception will be raised.
To escape arguments, use Shellwords.escape() method.
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/qbash.rb', line 47 def qbash(cmd, stdin: '', env: {}, log: Loog::NULL, accept: [0], both: false) if log.respond_to?(:debug) log.debug("+ #{cmd}") else log.print("+ #{cmd}\n") end buf = '' e = 1 cmd = cmd.join(' ') if cmd.is_a?(Array) Open3.popen2e(env, "/bin/bash -c #{Shellwords.escape(cmd)}") do |sin, sout, thr| sin.write(stdin) sin.close until sout.eof? begin ln = sout.gets rescue IOError => e ln = Backtrace.new(e).to_s end if log.respond_to?(:debug) log.debug(ln) else log.print("#{ln}\n") end buf += ln end e = thr.value.to_i raise "The command '#{cmd}' failed with exit code ##{e}\n#{buf}" if !accept.empty? && !accept.include?(e) end return [buf, e] if both buf end |