class Shell - Documentation for Ruby 2.3.0 (original) (raw)
Shell implements an idiomatic Ruby interface for common UNIX shell commands.
It provides users the ability to execute commands with filters and pipes, like sh
/csh
by using native facilities of Ruby.
Examples¶ ↑
Temp file creation¶ ↑
In this example we will create three tmpFile
's in three different folders under the /tmp
directory.
sh = Shell.cd("/tmp") sh.mkdir "shell-test-1" unless sh.exists?("shell-test-1")
sh.cd("shell-test-1") for dir in ["dir1", "dir3", "dir5"] if !sh.exists?(dir) sh.mkdir dir sh.cd(dir) do
f = sh.open("tmpFile", "w")
f.print "TEST\n"
f.close
end
print sh.pwd
end end
Temp file creation with self¶ ↑
This example is identical to the first, except we're using CommandProcessor#transact.
CommandProcessor#transact executes the given block against self, in this case sh
; our Shell object. Within the block we can substitute sh.cd
to cd
, because the scope within the block uses sh
already.
sh = Shell.cd("/tmp") sh.transact do mkdir "shell-test-1" unless exists?("shell-test-1") cd("shell-test-1") for dir in ["dir1", "dir3", "dir5"] if !exists?(dir) mkdir dir cd(dir) do f = open("tmpFile", "w") f.print "TEST\n" f.close end print pwd end end end
Pipe /etc/printcap into a file¶ ↑
In this example we will read the operating system file /etc/printcap
, generated by cupsd
, and then output it to a new file relative to the pwd
of sh
.
sh = Shell.new sh.cat("/etc/printcap") | sh.tee("tee1") > "tee2" (sh.cat < "/etc/printcap") | sh.tee("tee11") > "tee12" sh.cat("/etc/printcap") | sh.tee("tee1") >> "tee2" (sh.cat < "/etc/printcap") | sh.tee("tee11") >> "tee12"
Attributes
cwd[R]
Returns the current working directory.
dir[R]
Returns the current working directory.
getwd[R]
Returns the current working directory.
pwd[R]
Returns the current working directory.
system_path[R]
Returns the command search path in an array
umask[RW]
Returns the umask
Public Class Methods
alias_command(alias, command, *opts, &block) click to toggle source
Convenience method for Shell::CommandProcessor.alias_command. Defines an instance method which will execute a command under an alternative name.
Shell.def_system_command('date') Shell.alias_command('date_in_utc', 'date', '-u') Shell.new.date_in_utc
def Shell.alias_command(ali, command, *opts, &block) CommandProcessor.alias_command(ali, command, *opts, &block) end
cd(path) click to toggle source
Creates a new Shell instance with the current working directory set to path
.
def cd(path) new(path) end
debug=(val) click to toggle source
def debug=(val) @debug = val @verbose = val if val end
def_system_command(command, path = command) click to toggle source
Convenience method for Shell::CommandProcessor.def_system_command. Defines an instance method which will execute the given shell command. If the executable is not in Shell.default_system_path, you must supply the path to it.
Shell.def_system_command('hostname') Shell.new.hostname
Shell.def_system_command('run_my_program', "~/hello") Shell.new.run_my_program
def Shell.def_system_command(command, path = command) CommandProcessor.def_system_command(command, path) end
default_record_separator() click to toggle source
def default_record_separator if @default_record_separator @default_record_separator else $/ end end
default_record_separator=(rs) click to toggle source
def default_record_separator=(rs) @default_record_separator = rs end
default_system_path() click to toggle source
Returns the directories in the current shell's PATH environment variable as an array of directory names. This sets the system_path for all instances of Shell.
Example: If in your current shell, you did:
$ echo $PATH /usr/bin:/bin:/usr/local/bin
Running this method in the above shell would then return:
["/usr/bin", "/bin", "/usr/local/bin"]
def default_system_path if @default_system_path @default_system_path else ENV["PATH"].split(":") end end
default_system_path=(path) click to toggle source
Sets the system_path that new instances of Shell should have as their initial system_path.
path
should be an array of directory name strings.
def default_system_path=(path) @default_system_path = path end
install_system_commands(pre = "sys_") click to toggle source
Convenience method for Shell::CommandProcessor.install_system_commands. Defines instance methods representing all the executable files found in Shell.default_system_path, with the given prefix prepended to their names.
Shell.install_system_commands Shell.new.sys_echo("hello")
def Shell.install_system_commands(pre = "sys_") CommandProcessor.install_system_commands(pre) end
new(pwd, umask) → obj click to toggle source
Creates a Shell object which current directory is set to the process current directory, unless otherwise specified by the pwd
argument.
def initialize(pwd = Dir.pwd, umask = nil) @cwd = File.expand_path(pwd) @dir_stack = [] @umask = umask
@system_path = Shell.default_system_path @record_separator = Shell.default_record_separator
@command_processor = CommandProcessor.new(self) @process_controller = ProcessController.new(self)
@verbose = Shell.verbose @debug = Shell.debug end
notify(*opts) { |mes| ... } click to toggle source
def self.notify(*opts) Shell::debug_output_synchronize do if opts[-1].kind_of?(String) yorn = verbose? else yorn = opts.pop end return unless yorn
if @debug_display_thread_id
if @debug_display_process_id
prefix = "shell(##{Process.pid}:#{Thread.current.to_s.sub("Thread", "Th")}): "
else
prefix = "shell(#{Thread.current.to_s.sub("Thread", "Th")}): "
end
else
prefix = "shell: "
end
_head = true
STDERR.print opts.collect{|mes|
mes = mes.dup
yield mes if iterator?
if _head
_head = false
prefix + mes
else
" "* prefix.size + mes
end
}.join("\n")+"\n"
end end
unalias_command(ali) click to toggle source
undef_system_command(command) click to toggle source
Public Instance Methods
cd(path = nil, verbose = @verbose)
chdir(path) click to toggle source
Creates a Shell object which current directory is set to path
.
If a block is given, it restores the current directory when the block ends.
If called as iterator, it restores the current directory when the block ends.
def chdir(path = nil, verbose = @verbose) check_point
if iterator? notify("chdir(with block) #{path}") if verbose cwd_old = @cwd begin chdir(path, nil) yield ensure chdir(cwd_old, nil) end else notify("chdir #{path}") if verbose path = "~" unless path @cwd = expand_path(path) notify "current dir: #{@cwd}" rehash Void.new(self) end end
Also aliased as: cd
debug=(val) click to toggle source
def debug=(val) @debug = val @verbose = val if val end
expand_path(path) click to toggle source
def expand_path(path) File.expand_path(path, @cwd) end
inspect() click to toggle source
def inspect if debug.kind_of?(Integer) && debug > 2 super else to_s end end
jobs() click to toggle source
Returns a list of scheduled jobs.
def jobs @process_controller.jobs end
kill(signal, job) click to toggle source
Sends the given signal
to the given job
def kill(sig, command) @process_controller.kill_job(sig, command) end
popdir() click to toggle source
Pops a directory from the directory stack, and sets the current directory to it.
def popdir check_point
notify("popdir") if pop = @dir_stack.pop chdir pop notify "dir stack: [#{@dir_stack.join ', '}]" self else Shell.Fail DirStackEmpty end Void.new(self) end
Also aliased as: popd
pushd(path = nil, verbose = @verbose)
pushdir(path) click to toggle source
pushdir(path) { &block }
Pushes the current directory to the directory stack, changing the current directory to path
.
If path
is omitted, it exchanges its current directory and the top of its directory stack.
If a block is given, it restores the current directory when the block ends.
def pushdir(path = nil, verbose = @verbose) check_point
if iterator? notify("pushdir(with block) #{path}") if verbose pushdir(path, nil) begin yield ensure popdir end elsif path notify("pushdir #{path}") if verbose @dir_stack.push @cwd chdir(path, nil) notify "dir stack: [#{@dir_stack.join ', '}]" self else notify("pushdir") if verbose if pop = @dir_stack.pop @dir_stack.push @cwd chdir pop notify "dir stack: [#{@dir_stack.join ', '}]" self else Shell.Fail DirStackEmpty end end Void.new(self) end
Also aliased as: pushd
system_path=(path) click to toggle source
Sets the system path (the Shell instance's PATH environment variable).
path
should be an array of directory name strings.
def system_path=(path) @system_path = path rehash end