Книга: Программирование на языке Ruby
14.1.1. Методы system и exec
14.1.1. Методы system и exec
Метод system
(из модуля Kernel
) эквивалентен одноименной функции из библиотеки языка С. Он выполняет указанную команду в отдельной оболочке.
system("/usr/games/fortune")
# Вывод направляется, как обычно, на stdout...
Второй параметр, если он задан, должен содержать список аргументов; как правило, аргументы можно задавать и в командной строке — эффект будет тот же. Разница лишь в том, что алгоритм расширения имени файла применяется только к первой из переданных строк.
system("rm", "/tmp/file1")
system("rm /tmp/file2")
# Оба варианта годятся.
# А тут есть различие...
system("echo *") # Печатается список всех файлов.
system("echo","*") # Печатается звездочка (расширение
# имени файла не производится).
# Более сложные командные строки тоже работают.
system("ls -l | head -n |")
Посмотрим, как это будет работать в семействе операционных систем Windows. В случае с простой исполняемой программой поведение должно быть таким же, как в UNIX. В зависимости от варианта Ruby для вызова встроенных в оболочку команд может потребоваться запуск cmd.ехе
— интерпретатора команд в Windows (в некоторых версиях ОС он называется command.com
). Ниже приведены примеры запуска внешней и встроенной команды:
system("notepad.ехе","myfile.txt") # Никаких проблем...
system("cmd /с dir","somefile") # 'dir' - встроенная команда!
Другое решение — воспользоваться библиотекой Win32API
и определить собственный вариант метода system
.
require "Win32API"
def system(cmd)
sys = Win32API.new("crtdll", "system", ['P'], 'L')
sys.Call(cmd)
end
system("dir") # cmd /с необязательно!
Таким образом, можно добиться более-менее системно-независимого поведения system
. Но если вы хотите запомнить выведенную программой информацию (например, в переменной), то system
— не лучший способ (см. следующий раздел).
Упомяну еще метод exec
. Он ведет себя аналогично system
с тем отличием, что новый процесс замещает текущий. Поэтому код, следующий за exec
, исполняться не будет.
puts "Содержимое каталога:"
exec("ls", "-l")
puts "Эта строка никогда не исполняется!"
- 2.3 Executable and Linking Format
- 2.4 Mapping Executable Images into Target Embedded Systems
- System tools used for debugging
- Integrated Secure Communications System
- 9.1.4.2. Функции-оболочки: execl() и др.
- Когда включаю компьютер, при загрузке пишется Insert system disk and press enter. Что нужно делать?
- На всех дисках моего компьютера есть папка System Volume Information. Для чего она нужна?
- 14.5.1. Open Systems Interconnection
- 5.3. TRENDS IN DISTRIBUTED FILE SYSTEMS
- Абстрактный базовый класс FileSystemInfo
- 1. Basic microprocessor systems
- CHAPTER 12 System-Monitoring Tools