Module: Sevgi::Function::Shell
- Included in:
- Sevgi::Function
- Defined in:
- lib/sevgi/function/shell.rb
Overview
Shell execution helpers and executable lookup utilities.
Defined Under Namespace
Instance Method Summary collapse
-
#executable!(*args) ⇒ nil
Requires the first command argument to name an executable program.
-
#executable?(program) ⇒ Boolean
Checks whether a program exists and is executable.
-
#sh(*args) { ... } ⇒ Sevgi::Function::Shell::Result
Runs a command and captures stdout, stderr, and exit status.
-
#sh!(*args) { ... } ⇒ Sevgi::Function::Shell::Result
Runs a command, requiring both executable lookup and successful exit status.
Instance Method Details
#executable!(*args) ⇒ nil
Requires the first command argument to name an executable program.
27 28 29 30 |
# File 'lib/sevgi/function/shell.rb', line 27 def executable!(*args) program = args.first.to_s.split.first Error.("Missing executable: #{program}") unless executable?(program) end |
#executable?(program) ⇒ Boolean
PATH is evaluated on every call; empty PATH segments mean the current directory.
Checks whether a program exists and is executable.
13 14 15 16 17 18 19 20 21 |
# File 'lib/sevgi/function/shell.rb', line 13 def executable?(program) program = program.to_s return false if program.empty? return executable_file?(program) if slash_path?(program) ENV.fetch("PATH", "").split(::File::PATH_SEPARATOR, -1).any? do |dir| executable_file?(::File.join(dir.empty? ? "." : dir, program)) end end |
#sh(*args) { ... } ⇒ Sevgi::Function::Shell::Result
202 |
# File 'lib/sevgi/function/shell.rb', line 202 def sh(...) = Runner.new.(...) |
#sh!(*args) { ... } ⇒ Sevgi::Function::Shell::Result
The child's stdin is closed after the input block. During execution, the first SIGINT sends TERM to the child process and the second SIGINT sends KILL; the previous SIGINT handler is restored before return.
Runs a command, requiring both executable lookup and successful exit status.
214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/sevgi/function/shell.rb', line 214 def sh!(*args, &block) executable!(*args) unless args.empty? sh(*args, &block).tap do |result| unless result.ok? warn(result.err) warn("") Error.("Command failed: #{result.cmd}") end end end |