Spec-Zone.ru › Ruby 2.6

класс 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

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

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[R]
debug?[R]
verbose[RW]
verbose?[RW]
command_processor[R]
cwd[R]

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

debug[R]
debug?[R]
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 395
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 127
def cd(path)
  new(path)
end

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

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

Метод-удобство для Shell::CommandProcessor.def_system_command. Определяет метод экземпляра, который будет выполнять заданную командную строку. Если исполняемый файл не находится в Shell.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 160
def default_record_separator
  if @default_record_separator
    @default_record_separator
  else
    $/
  end
end
default_record_separator=(rs) Показать исходный код
# File lib/shell.rb, line 168
def default_record_separator=(rs)
  @default_record_separator = rs
end
default_system_path() Показать исходный код
# File lib/shell.rb, line 144
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 156
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 415
def Shell.install_system_commands(pre = "sys_")
  CommandProcessor.install_system_commands(pre)
end

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

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

Метод-удобство для Shell::CommandProcessor.unalias_command

undef_system_command(command) Показать исходный код
# File lib/shell.rb, line 380
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 263
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 218
def debug=(val)
  @debug = val
  @verbose = val if val
end
expand_path(path) Показать исходный код
# File lib/shell.rb, line 229
def expand_path(path)
  File.expand_path(path, @cwd)
end
inspect() Показать исходный код
# File lib/shell.rb, line 420
def inspect
  if debug.kind_of?(Integer) && debug > 2
    super
  else
    to_s
  end
end
Вызывает метод суперкласса Object#inspect
jobs() Показать исходный код
# File lib/shell.rb, line 347
def jobs
  @process_controller.jobs
end

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

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

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

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