Spec-Zone.ru › Ruby 2.3

класс Shell

Родитель:
Объект
Включенные модули:
Shell::Error

Shell реализует удобный интерфейс Ruby для общих команд оболочки UNIX.

Он предоставляет пользователям возможность выполнять команды с фильтрами и каналами, например, sh/csh с использованием собственных возможностей Ruby.

Примеры

Создание временного файла

В этом примере мы создадим три tmpFile в трёх разных папках в каталоге /tmp.

sh = Shell.cd("/tmp") # Change to the /tmp directory
sh.mkdir "shell-test-1" unless sh.exists?("shell-test-1")
# make the 'shell-test-1' directory if it doesn't already exist
sh.cd("shell-test-1") # Change to the /tmp/shell-test-1 directory
for dir in ["dir1", "dir3", "dir5"]
  if !sh.exists?(dir)
    sh.mkdir dir # make dir if it doesn't already exist
    sh.cd(dir) do
      # change to the `dir` directory
      f = sh.open("tmpFile", "w") # open a new file in write mode
      f.print "TEST\n"            # write to the file
      f.close                     # close the file handler
    end
    print sh.pwd                  # output the process working directory
  end
end

Создание временного файла с использованием self

Этот пример идентичен первому, за исключением использования Shell::CommandProcessor#transact.

Shell::CommandProcessor#transact выполняет заданный блок относительно self, в данном случае sh; нашего объекта Shell. Внутри блока мы можем заменить sh.cd на cd, поскольку область действия внутри блока уже использует sh.

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

Перенаправление /etc/printcap в файл

В этом примере мы будем читать системный файл /etc/printcap, сгенерированный cupsd, и затем выводить его в новый файл, относящийся к каталогу pwd объекта 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"

Атрибуты

cascade[RW]
debug[RW]
debug?[RW]
verbose[RW]
verbose?[RW]
command_processor[R]
cwd[R]

Возвращает текущую рабочую директорию.

debug[RW]
debug?[RW]
dir[R]

Возвращает текущую рабочую директорию.

dir_stack[R]
dirs[R]
getwd[R]

Возвращает текущую рабочую директорию.

process_controller[R]
pwd[R]

Возвращает текущую рабочую директорию.

record_separator[RW]
system_path[R]

Возвращает путь поиска команд в массиве

umask[RW]

Возвращает umask

verbose[RW]
verbose?[RW]

Методы публичного класса

alias_command(alias, command, *opts, &block) Показать исходный код
# File lib/shell.rb, line 392
def Shell.alias_command(ali, command, *opts, &block)
  CommandProcessor.alias_command(ali, command, *opts, &block)
end

Метод-обёртка для Shell::CommandProcessor.alias_command. Определяет метод экземпляра, который будет выполнять команду под альтернативным именем.

Shell.def_system_command('date')
Shell.alias_command('date_in_utc', 'date', '-u')
Shell.new.date_in_utc # => Sat Jan 25 16:59:57 UTC 2014
cd(path) Показать исходный код
# File lib/shell.rb, line 125
def cd(path)
  new(path)
end

Создаёт новый экземпляр Shell с текущей рабочей директорией, установленной в path.

debug=(val) Показать исходный код
# File lib/shell.rb, line 114
def debug=(val)
  @debug = val
  @verbose = val if val
end
def_system_command(command, path = command) Показать исходный код
# File lib/shell.rb, line 372
def Shell.def_system_command(command, path = command)
  CommandProcessor.def_system_command(command, path)
end

Метод-обёртка для Shell::CommandProcessor.def_system_command. Определяет метод экземпляра, который будет выполнять данную команду оболочки. Если исполняемый файл не находится в ::default_system_path, вы должны указать путь к нему.

Shell.def_system_command('hostname')
Shell.new.hostname # => localhost

# How to use an executable that's not in the default path

Shell.def_system_command('run_my_program', "~/hello")
Shell.new.run_my_program # prints "Hello from a C program!"
default_record_separator() Показать исходный код
# File lib/shell.rb, line 158
def default_record_separator
  if @default_record_separator
    @default_record_separator
  else
    $/
  end
end
default_record_separator=(rs) Показать исходный код
# File lib/shell.rb, line 166
def default_record_separator=(rs)
  @default_record_separator = rs
end
default_system_path() Показать исходный код
# File lib/shell.rb, line 142
def default_system_path
  if @default_system_path
    @default_system_path
  else
    ENV["PATH"].split(":")
  end
end

Возвращает директории из переменной среды PATH текущей оболочки в виде массива имён директорий. Это задаёт #system_path для всех экземпляров Shell.

Пример: Если в вашей текущей оболочке вы выполнили:

$ echo $PATH
/usr/bin:/bin:/usr/local/bin

Выполнение этого метода в указанной выше оболочке вернёт:

["/usr/bin", "/bin", "/usr/local/bin"]
default_system_path=(path) Показать исходный код
# File lib/shell.rb, line 154
def default_system_path=(path)
  @default_system_path = path
end

Устанавливает #system_path, который должны иметь новые экземпляры Shell как их начальный system_path.

path должен быть массивом строк имён директорий.

install_system_commands(pre = "sys_") Показать исходный код
# File lib/shell.rb, line 412
def Shell.install_system_commands(pre = "sys_")
  CommandProcessor.install_system_commands(pre)
end

Метод-обёртка для Shell::CommandProcessor.install_system_commands. Определяет методы экземпляров, представляющие все исполняемые файлы, найденные в ::default_system_path, с заданным префиксом, добавленным к их именам.

Shell.install_system_commands
Shell.new.sys_echo("hello") # => hello
new(pwd, umask) → obj Показать исходный код
# File lib/shell.rb, line 183
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

Создаёт объект Shell, текущей директорией которого является текущая директория процесса, если не указано иное аргументом pwd.

notify(*opts) { |mes| ... } Показать исходный код
# File lib/shell.rb, line 425
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) Показать исходный код
# File lib/shell.rb, line 397
def Shell.unalias_command(ali)
  CommandProcessor.unalias_command(ali)
end

Метод-обёртка для Shell::CommandProcessor.unalias_command

undef_system_command(command) Показать исходный код
# File lib/shell.rb, line 377
def Shell.undef_system_command(command)
  CommandProcessor.undef_system_command(command)
end

Метод-обёртка для Shell::CommandProcessor.undef_system_command

Публичные методы экземпляров

cd(path = nil, verbose = @verbose)
Псевдоним для: chdir
chdir(path) Показать исходный код
# File lib/shell.rb, line 260
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

Создаёт объект Shell, текущий каталог которого установлен на path.

Если задан блок кода, текущий каталог восстанавливается по окончании блока.

Если вызывается как итератор, текущий каталог восстанавливается по окончании блока.

Также псевдоним для: cd
debug=(val) Показать исходный код
# File lib/shell.rb, line 215
def debug=(val)
  @debug = val
  @verbose = val if val
end
expand_path(path) Показать исходный код
# File lib/shell.rb, line 226
def expand_path(path)
  File.expand_path(path, @cwd)
end
inspect() Показать исходный код
# File lib/shell.rb, line 417
def inspect
  if debug.kind_of?(Integer) && debug > 2
    super
  else
    to_s
  end
end
Вызывает метод суперкласса Object#inspect
jobs() Показать исходный код
# File lib/shell.rb, line 344
def jobs
  @process_controller.jobs
end

Возвращает список запланированных задач.

kill(signal, job) Показать исходный код
# File lib/shell.rb, line 352
def kill(sig, command)
  @process_controller.kill_job(sig, command)
end

Отправляет заданный signal заданному job

popd()
Псевдоним для: popdir
popdir() Показать исходный код
# File lib/shell.rb, line 328
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

Извлекает каталог из стека каталогов и устанавливает текущий каталог на него.

Также псевдоним для: popd
pushd(path = nil, verbose = @verbose)
Псевдоним для: pushdir
pushdir(path) Показать исходный код
pushdir(path) { &block }
# File lib/shell.rb, line 294
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

Добавляет текущий каталог в стек каталогов, изменяя текущий каталог на path.

Если path опущено, происходит обмен текущим каталогом и вершиной стека каталогов.

Если задан блок, текущий каталог восстанавливается по завершении блока.

Также псевдоним для: pushd
system_path=(path) Показать исходный код
# File lib/shell.rb, line 204
def system_path=(path)
  @system_path = path
  rehash
end

Устанавливает системный путь (переменную окружения PATH экземпляра Shell).

path должен быть массивом строк имён каталогов.

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API