| Class | Shell::CommandProcessor |
| In: |
lib/shell/command-processor.rb
|
| Parent: | Object |
| NoDelegateMethods | = | ["initialize", "expand_path"] | initialize of Shell and related classes. |
| test | -> | top_level_test |
CommandProcessor#test(command,
file1, file2) CommandProcessor#[command, file1, file2]
command: char or String or Symbol
file1: String
file2: String(optional)
return: Boolean
same as:
test() (when command is char or length 1 string or symbol)
FileTest.command (others)
example:
sh[?e, "foo"]
sh[:e, "foo"]
sh["e", "foo"]
sh[:exists?, "foo"]
sh["exists?", "foo"]
|
||
# File lib/shell/command-processor.rb, line 505
505: def self.add_delegate_command_to_shell(id)
506: id = id.intern if id.kind_of?(String)
507: name = id.id2name
508: if Shell.method_defined?(id)
509: Shell.notify "warn: override definnition of Shell##{name}."
510: Shell.notify "warn: alias Shell##{name} to Shell##{name}_org.\n"
511: Shell.module_eval "alias #{name}_org #{name}"
512: end
513: Shell.notify "method added: Shell##{name}.", Shell.debug?
514: Shell.module_eval(%Q[def #{name}(*args, &block)
515: begin
516: @command_processor.__send__(:#{name}, *args, &block)
517: rescue Exception
518: $@.delete_if{|s| /:in `__getobj__'$/ =~ s} #`
519: $@.delete_if{|s| /^\\(eval\\):/ =~ s}
520: raise
521: end
522: end], __FILE__, __LINE__)
523:
524: if Shell::Filter.method_defined?(id)
525: Shell.notify "warn: override definnition of Shell::Filter##{name}."
526: Shell.notify "warn: alias Shell##{name} to Shell::Filter##{name}_org."
527: Filter.module_eval "alias #{name}_org #{name}"
528: end
529: Shell.notify "method added: Shell::Filter##{name}.", Shell.debug?
530: Filter.module_eval(%Q[def #{name}(*args, &block)
531: begin
532: self | @shell.__send__(:#{name}, *args, &block)
533: rescue Exception
534: $@.delete_if{|s| /:in `__getobj__'$/ =~ s} #`
535: $@.delete_if{|s| /^\\(eval\\):/ =~ s}
536: raise
537: end
538: end], __FILE__, __LINE__)
539: end
# File lib/shell/command-processor.rb, line 396
396: def self.alias_command(ali, command, *opts, &block)
397: ali = ali.id2name if ali.kind_of?(Symbol)
398: command = command.id2name if command.kind_of?(Symbol)
399: begin
400: if iterator?
401: @alias_map[ali.intern] = proc
402:
403: eval((d = %Q[def #{ali}(*opts)
404: @shell.__send__(:#{command},
405: *(CommandProcessor.alias_map[:#{ali}].call *opts))
406: end]), nil, __FILE__, __LINE__ - 1)
407:
408: else
409: args = opts.collect{|opt| '"' + opt + '"'}.join(",")
410: eval((d = %Q[def #{ali}(*opts)
411: @shell.__send__(:#{command}, #{args}, *opts)
412: end]), nil, __FILE__, __LINE__ - 1)
413: end
414: rescue SyntaxError
415: Shell.notify "warn: Can't alias #{ali} command: #{command}."
416: Shell.notify("Definition of #{ali}: ", d)
417: raise
418: end
419: Shell.notify "Define #{ali} command: #{command}.", Shell.debug?
420: Shell.notify("Definition of #{ali}: ", d,
421: Shell.debug.kind_of?(Integer) && Shell.debug > 1)
422: self
423: end
CommandProcessor.def_builtin_commands(delegation_class, command_specs)
delegation_class: Class or Module
command_specs: [[command_name, [argument,...]],...]
command_name: String
arguments: String
FILENAME?? -> expand_path(filename??)
*FILENAME?? -> filename??.collect{|f|expand_path(f)}.join(", ")
define command_name(argument,...) as
delegation_class.command_name(argument,...)
# File lib/shell/command-processor.rb, line 442
442: def self.def_builtin_commands(delegation_class, command_specs)
443: for meth, args in command_specs
444: arg_str = args.collect{|arg| arg.downcase}.join(", ")
445: call_arg_str = args.collect{
446: |arg|
447: case arg
448: when /^(FILENAME.*)$/
449: format("expand_path(%s)", $1.downcase)
450: when /^(\*FILENAME.*)$/
451: # \*FILENAME* -> filenames.collect{|fn| expand_path(fn)}.join(", ")
452: $1.downcase + '.collect{|fn| expand_path(fn)}'
453: else
454: arg
455: end
456: }.join(", ")
457: d = %Q[def #{meth}(#{arg_str})
458: #{delegation_class}.#{meth}(#{call_arg_str})
459: end]
460: Shell.notify "Define #{meth}(#{arg_str})", Shell.debug?
461: Shell.notify("Definition of #{meth}: ", d,
462: Shell.debug.kind_of?(Integer) && Shell.debug > 1)
463: eval d
464: end
465: end
CommandProcessor.def_system_command(command, path)
command: String
path: String
define 'command()' method as method.
# File lib/shell/command-processor.rb, line 366
366: def self.def_system_command(command, path = command)
367: begin
368: eval((d = %Q[def #{command}(*opts)
369: SystemCommand.new(@shell, '#{path}', *opts)
370: end]), nil, __FILE__, __LINE__ - 1)
371: rescue SyntaxError
372: Shell.notify "warn: Can't define #{command} path: #{path}."
373: end
374: Shell.notify "Define #{command} path: #{path}.", Shell.debug?
375: Shell.notify("Definition of #{command}: ", d,
376: Shell.debug.kind_of?(Integer) && Shell.debug > 1)
377: end
# File lib/shell/command-processor.rb, line 30
30: def self.initialize
31:
32: install_builtin_commands
33:
34: # define CommandProccessor#methods to Shell#methods and Filter#methods
35: for m in CommandProcessor.instance_methods(false) - NoDelegateMethods
36: add_delegate_command_to_shell(m)
37: end
38:
39: def self.method_added(id)
40: add_delegate_command_to_shell(id)
41: end
42: end
define default builtin commands
# File lib/shell/command-processor.rb, line 544
544: def self.install_builtin_commands
545: # method related File.
546: # (exclude open/foreach/unlink)
547: normal_delegation_file_methods = [
548: ["atime", ["FILENAME"]],
549: ["basename", ["fn", "*opts"]],
550: ["chmod", ["mode", "*FILENAMES"]],
551: ["chown", ["owner", "group", "*FILENAME"]],
552: ["ctime", ["FILENAMES"]],
553: ["delete", ["*FILENAMES"]],
554: ["dirname", ["FILENAME"]],
555: ["ftype", ["FILENAME"]],
556: ["join", ["*items"]],
557: ["link", ["FILENAME_O", "FILENAME_N"]],
558: ["lstat", ["FILENAME"]],
559: ["mtime", ["FILENAME"]],
560: ["readlink", ["FILENAME"]],
561: ["rename", ["FILENAME_FROM", "FILENAME_TO"]],
562: # ["size", ["FILENAME"]],
563: ["split", ["pathname"]],
564: ["stat", ["FILENAME"]],
565: ["symlink", ["FILENAME_O", "FILENAME_N"]],
566: ["truncate", ["FILENAME", "length"]],
567: ["utime", ["atime", "mtime", "*FILENAMES"]]]
568:
569: def_builtin_commands(File, normal_delegation_file_methods)
570: alias_method :rm, :delete
571:
572: # method related FileTest
573: def_builtin_commands(FileTest,
574: FileTest.singleton_methods(false).collect{|m| [m, ["FILENAME"]]})
575:
576: # method related ftools
577: normal_delegation_ftools_methods = [
578: ["syscopy", ["FILENAME_FROM", "FILENAME_TO"]],
579: ["copy", ["FILENAME_FROM", "FILENAME_TO"]],
580: ["move", ["FILENAME_FROM", "FILENAME_TO"]],
581: ["compare", ["FILENAME_FROM", "FILENAME_TO"]],
582: ["safe_unlink", ["*FILENAMES"]],
583: ["makedirs", ["*FILENAMES"]],
584: # ["chmod", ["mode", "*FILENAMES"]],
585: ["install", ["FILENAME_FROM", "FILENAME_TO", "mode"]],
586: ]
587: def_builtin_commands(File,
588: normal_delegation_ftools_methods)
589: alias_method :cmp, :compare
590: alias_method :mv, :move
591: alias_method :cp, :copy
592: alias_method :rm_f, :safe_unlink
593: alias_method :mkpath, :makedirs
594: end
CommandProcessor.install_system_commands(pre)
pre: String - command name prefix
defines every command which belongs in default_system_path via CommandProcessor.command(). It doesn‘t define already defined methods twice. By default, "pre_" is prefixes to each method name. Characters that may not be used in a method name are all converted to ‘_’. Definition errors are just ignored.
# File lib/shell/command-processor.rb, line 476
476: def self.install_system_commands(pre = "sys_")
477: defined_meth = {}
478: for m in Shell.methods
479: defined_meth[m] = true
480: end
481: sh = Shell.new
482: for path in Shell.default_system_path
483: next unless sh.directory? path
484: sh.cd path
485: sh.foreach do
486: |cn|
487: if !defined_meth[pre + cn] && sh.file?(cn) && sh.executable?(cn)
488: command = (pre + cn).gsub(/\W/, "_").sub(/^([0-9])/, '_\1')
489: begin
490: def_system_command(command, sh.expand_path(cn))
491: rescue
492: Shell.notify "warn: Can't define #{command} path: #{cn}"
493: end
494: defined_meth[command] = command
495: end
496: end
497: end
498: end
# File lib/shell/command-processor.rb, line 39
39: def self.method_added(id)
40: add_delegate_command_to_shell(id)
41: end
# File lib/shell/command-processor.rb, line 60
60: def initialize(shell)
61: @shell = shell
62: @system_commands = {}
63: end
include run file.
# File lib/shell/command-processor.rb, line 47
47: def self.run_config
48: begin
49: load File.expand_path("~/.rb_shell") if ENV.key?("HOME")
50: rescue LoadError, Errno::ENOENT
51: rescue
52: print "load error: #{rc}\n"
53: print $!.class, ": ", $!, "\n"
54: for err in $@[0, $@.size - 2]
55: print "\t", err, "\n"
56: end
57: end
58: end
# File lib/shell/command-processor.rb, line 425
425: def self.unalias_command(ali)
426: ali = ali.id2name if ali.kind_of?(Symbol)
427: @alias_map.delete ali.intern
428: undef_system_command(ali)
429: end
# File lib/shell/command-processor.rb, line 379
379: def self.undef_system_command(command)
380: command = command.id2name if command.kind_of?(Symbol)
381: remove_method(command)
382: Shell.module_eval{remove_method(command)}
383: Filter.module_eval{remove_method(command)}
384: self
385: end
# File lib/shell/command-processor.rb, line 286
286: def append(to, filter)
287: case to
288: when String
289: AppendFile.new(@shell, to, filter)
290: when IO
291: AppendIO.new(@shell, to, filter)
292: else
293: Shell.Fail Error::CantApplyMethod, "append", to.class
294: end
295: end
# File lib/shell/command-processor.rb, line 274
274: def cat(*filenames)
275: Cat.new(@shell, *filenames)
276: end
ProcessCommand#transact
# File lib/shell/command-processor.rb, line 250
250: def check_point
251: @shell.process_controller.wait_all_jobs_execution
252: end
# File lib/shell/command-processor.rb, line 301
301: def concat(*jobs)
302: Concat.new(@shell, *jobs)
303: end
# File lib/shell/command-processor.rb, line 270
270: def echo(*strings)
271: Echo.new(@shell, *strings)
272: end
CommandProcessor#expand_path(path)
path: String
return: String
returns the absolute path for <path>
# File lib/shell/command-processor.rb, line 71
71: def expand_path(path)
72: @shell.expand_path(path)
73: end
# File lib/shell/command-processor.rb, line 336
336: def find_system_command(command)
337: return command if /^\// =~ command
338: case path = @system_commands[command]
339: when String
340: if exists?(path)
341: return path
342: else
343: Shell.Fail Error::CommandNotFound, command
344: end
345: when false
346: Shell.Fail Error::CommandNotFound, command
347: end
348:
349: for p in @shell.system_path
350: path = join(p, command)
351: if FileTest.exists?(path)
352: @system_commands[command] = path
353: return path
354: end
355: end
356: @system_commands[command] = false
357: Shell.Fail Error::CommandNotFound, command
358: end
File related commands Shell#foreach Shell#open Shell#unlink Shell#test
-
CommandProcessor#foreach(path, rs)
path: String
rs: String - record separator
iterator
Same as:
File#foreach (when path is file)
Dir#foreach (when path is directory)
path is relative to pwd
# File lib/shell/command-processor.rb, line 93
93: def foreach(path = nil, *rs)
94: path = "." unless path
95: path = expand_path(path)
96:
97: if File.directory?(path)
98: Dir.foreach(path){|fn| yield fn}
99: else
100: IO.foreach(path, *rs){|l| yield l}
101: end
102: end
def sort(*filenames)
Sort.new(self, *filenames)
end
# File lib/shell/command-processor.rb, line 282
282: def glob(pattern)
283: Glob.new(@shell, pattern)
284: end
%pwd, %cwd -> @pwd
# File lib/shell/command-processor.rb, line 306
306: def notify(*opts, &block)
307: Thread.exclusive do
308: Shell.notify(*opts) {|mes|
309: yield mes if iterator?
310:
311: mes.gsub!("%pwd", "#{@cwd}")
312: mes.gsub!("%cwd", "#{@cwd}")
313: }
314: end
315: end
CommandProcessor#open(path, mode)
path: String
mode: String
return: File or Dir
Same as:
File#open (when path is file)
Dir#open (when path is directory)
mode has an effect only when path is a file
# File lib/shell/command-processor.rb, line 114
114: def open(path, mode)
115: path = expand_path(path)
116: if File.directory?(path)
117: Dir.open(path)
118: else
119: effect_umask do
120: File.open(path, mode)
121: end
122: end
123: end
internal commands
# File lib/shell/command-processor.rb, line 266
266: def out(dev = STDOUT, &block)
267: dev.print transact(&block)
268: end
ProcessCommand#rehash
clear command hash table.
# File lib/shell/command-processor.rb, line 243
243: def rehash
244: @system_commands = {}
245: end
path: String
same as Dir.rmdir()
# File lib/shell/command-processor.rb, line 212
212: def rmdir(*path)
213: for dir in path
214: Dir.rmdir(expand_path(dir))
215: end
216: end
CommandProcessor#system(command, *opts)
command: String
opts: String
return: SystemCommand
Same as system() function
example:
print sh.system("ls", "-l")
sh.system("ls", "-l") | sh.head > STDOUT
# File lib/shell/command-processor.rb, line 228
228: def system(command, *opts)
229: if opts.empty?
230: if command =~ /\*|\?|\{|\}|\[|\]|<|>|\(|\)|~|&|\||\\|\$|;|'|`|"|\n/
231: return SystemCommand.new(@shell, find_system_command("sh"), "-c", command)
232: else
233: command, *opts = command.split(/\s+/)
234: end
235: end
236: SystemCommand.new(@shell, find_system_command(command), *opts)
237: end
# File lib/shell/command-processor.rb, line 297
297: def tee(file)
298: Tee.new(@shell, file)
299: end
# File lib/shell/command-processor.rb, line 159
159: def test(command, file1, file2=nil)
160: file1 = expand_path(file1)
161: file2 = expand_path(file2) if file2
162: command = command.id2name if command.kind_of?(Symbol)
163:
164: case command
165: when Integer
166: if file2
167: top_level_test(command, file1, file2)
168: else
169: top_level_test(command, file1)
170: end
171: when String
172: if command.size == 1
173: if file2
174: top_level_test(command, file1, file2)
175: else
176: top_level_test(command, file1)
177: end
178: else
179: if file2
180: FileTest.send(command, file1, file2)
181: else
182: FileTest.send(command, file1)
183: end
184: end
185: end
186: end
# File lib/shell/command-processor.rb, line 255
255: def transact(&block)
256: begin
257: @shell.instance_eval(&block)
258: ensure
259: check_point
260: end
261: end
same as:
Dir#unlink (when path is directory)
File#unlink (when path is file)
# File lib/shell/command-processor.rb, line 132
132: def unlink(path)
133: path = expand_path(path)
134: if File.directory?(path)
135: Dir.unlink(path)
136: else
137: IO.unlink(path)
138: end
139: end