mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Yay, shell.rb is back!
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1423 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d9a07d5506
commit
4578a096d1
1 changed files with 273 additions and 0 deletions
273
lib/shell.rb
Normal file
273
lib/shell.rb
Normal file
|
@ -0,0 +1,273 @@
|
|||
#
|
||||
# shell.rb -
|
||||
# $Release Version: 0.6.0 $
|
||||
# $Revision: 1.8 $
|
||||
# $Date: 2001/03/19 09:01:11 $
|
||||
# by Keiju ISHITSUKA(Nippon Rational Inc.)
|
||||
#
|
||||
# --
|
||||
#
|
||||
#
|
||||
#
|
||||
|
||||
require "e2mmap"
|
||||
require "thread"
|
||||
|
||||
require "shell/error"
|
||||
require "shell/command-processor"
|
||||
require "shell/process-controller"
|
||||
|
||||
class Shell
|
||||
@RCS_ID='-$Id: shell.rb,v 1.8 2001/03/19 09:01:11 keiju Exp keiju $-'
|
||||
|
||||
include Error
|
||||
extend Exception2MessageMapper
|
||||
|
||||
# @cascade = true
|
||||
# debug: true -> normal debug
|
||||
# debug: 1 -> eval definition debug
|
||||
# debug: 2 -> detail inspect debug
|
||||
@debug = false
|
||||
@verbose = true
|
||||
|
||||
class << Shell
|
||||
attr :cascade, true
|
||||
attr :debug, true
|
||||
attr :verbose, true
|
||||
|
||||
# alias cascade? cascade
|
||||
alias debug? debug
|
||||
alias verbose? verbose
|
||||
@verbose = true
|
||||
|
||||
def debug=(val)
|
||||
@debug = val
|
||||
@verbose = val if val
|
||||
end
|
||||
|
||||
def cd(path)
|
||||
sh = new
|
||||
sh.cd path
|
||||
sh
|
||||
end
|
||||
|
||||
def default_system_path
|
||||
if @default_system_path
|
||||
@default_system_path
|
||||
else
|
||||
ENV["PATH"].split(":")
|
||||
end
|
||||
end
|
||||
|
||||
def default_system_path=(path)
|
||||
@default_system_path = path
|
||||
end
|
||||
|
||||
def default_record_separator
|
||||
if @default_record_separator
|
||||
@default_record_separator
|
||||
else
|
||||
$/
|
||||
end
|
||||
end
|
||||
|
||||
def default_record_separator=(rs)
|
||||
@default_record_separator = rs
|
||||
end
|
||||
end
|
||||
|
||||
def initialize
|
||||
@cwd = Dir.pwd
|
||||
@dir_stack = []
|
||||
@umask = nil
|
||||
|
||||
@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
|
||||
|
||||
attr_reader :system_path
|
||||
|
||||
def system_path=(path)
|
||||
@system_path = path
|
||||
rehash
|
||||
end
|
||||
|
||||
attr :umask, true
|
||||
attr :record_separator, true
|
||||
|
||||
attr :verbose, true
|
||||
attr :debug, true
|
||||
|
||||
def debug=(val)
|
||||
@debug = val
|
||||
@verbose = val if val
|
||||
end
|
||||
|
||||
alias verbose? verbose
|
||||
alias debug? debug
|
||||
|
||||
attr_reader :command_processor
|
||||
attr_reader :process_controller
|
||||
|
||||
def expand_path(path)
|
||||
if /^\// =~ path
|
||||
File.expand_path(path)
|
||||
else
|
||||
File.expand_path(File.join(@cwd, path))
|
||||
end
|
||||
end
|
||||
|
||||
# ほとんどのShell Command は CommandProcessor により定義される.
|
||||
|
||||
#
|
||||
# Dir関連メソッド
|
||||
#
|
||||
# Shell#cwd/dir/getwd/pwd
|
||||
# Shell#chdir/cd
|
||||
# Shell#pushdir/pushd
|
||||
# Shell#popdir/popd
|
||||
# Shell#mkdir
|
||||
# Shell#rmdir
|
||||
|
||||
attr :cwd
|
||||
alias dir cwd
|
||||
alias getwd cwd
|
||||
alias pwd cwd
|
||||
|
||||
attr :dir_stack
|
||||
alias dirs dir_stack
|
||||
|
||||
# イテレータとして呼ばれると一時的にcdすることになる.
|
||||
def chdir(path = nil)
|
||||
if iterator?
|
||||
cwd_old = @cwd
|
||||
begin
|
||||
chdir(path)
|
||||
yield
|
||||
ensure
|
||||
chdir(cwd_old)
|
||||
end
|
||||
else
|
||||
path = "~" unless path
|
||||
@cwd = expand_path(path)
|
||||
notify "current dir: #{@cwd}"
|
||||
rehash
|
||||
self
|
||||
end
|
||||
end
|
||||
alias cd chdir
|
||||
|
||||
def pushdir(path = nil)
|
||||
if iterator?
|
||||
pushdir(path)
|
||||
begin
|
||||
yield
|
||||
ensure
|
||||
popdir
|
||||
end
|
||||
elsif path
|
||||
@dir_stack.push @cwd
|
||||
chdir path
|
||||
notify "dir stack: [#{@dir_stack.join ', '}]"
|
||||
self
|
||||
else
|
||||
if pop = @dir_stack.pop
|
||||
@dir_stack.push @cwd
|
||||
chdir pop
|
||||
notify "dir stack: [#{@dir_stack.join ', '}]"
|
||||
self
|
||||
else
|
||||
Shell.Fail DirStackEmpty
|
||||
end
|
||||
end
|
||||
end
|
||||
alias pushd pushdir
|
||||
|
||||
def popdir
|
||||
if pop = @dir_stack.pop
|
||||
chdir pop
|
||||
notify "dir stack: [#{@dir_stack.join ', '}]"
|
||||
self
|
||||
else
|
||||
Shell.Fail DirStackEmpty
|
||||
end
|
||||
end
|
||||
alias popd popdir
|
||||
|
||||
|
||||
#
|
||||
# process 管理
|
||||
#
|
||||
def jobs
|
||||
@process_controller.jobs
|
||||
end
|
||||
|
||||
def kill(sig, command)
|
||||
@process_controller.kill_job(sig, command)
|
||||
end
|
||||
|
||||
#
|
||||
# command 定義
|
||||
#
|
||||
def Shell.def_system_command(command, path = command)
|
||||
CommandProcessor.def_system_command(command, path)
|
||||
end
|
||||
|
||||
def Shell.undef_system_command(command)
|
||||
CommandProcessor.undef_system_command(command)
|
||||
end
|
||||
|
||||
def Shell.alias_command(ali, command, *opts, &block)
|
||||
CommandProcessor.alias_command(ali, command, *opts, &block)
|
||||
end
|
||||
|
||||
def Shell.unalias_command(ali)
|
||||
CommandProcessor.unalias_command(ali)
|
||||
end
|
||||
|
||||
def Shell.install_system_commands(pre = "sys_")
|
||||
CommandProcessor.install_system_commands(pre)
|
||||
end
|
||||
|
||||
#
|
||||
def inspect
|
||||
if debug.kind_of?(Integer) && debug > 2
|
||||
super
|
||||
else
|
||||
to_s
|
||||
end
|
||||
end
|
||||
|
||||
def self.notify(*opts, &block)
|
||||
Thread.exclusive do
|
||||
if opts[-1].kind_of?(String)
|
||||
yorn = verbose?
|
||||
else
|
||||
yorn = opts.pop
|
||||
end
|
||||
return unless yorn
|
||||
|
||||
_head = true
|
||||
print *opts.collect{|mes|
|
||||
mes = mes.dup
|
||||
yield mes if iterator?
|
||||
if _head
|
||||
_head = false
|
||||
"shell: " + mes
|
||||
else
|
||||
" " + mes
|
||||
end
|
||||
}.join("\n")+"\n"
|
||||
end
|
||||
end
|
||||
|
||||
CommandProcessor.initialize
|
||||
CommandProcessor.run_config
|
||||
end
|
||||
|
Loading…
Reference in a new issue