Если вы хотите воспользоваться вариативной формой Kernel.system, которая обходит многие проблемы с цитированием оболочек, вы можете использовать те же параметры , которые Kernel.spawn принимает .
TL; DR - используйте :out => File::NULL
для отключения вывода из Kernel.system
Аргументы со специальными символами (пробелы и т. Д.) Могут вызвать проблемы с оболочкой:
irb(main):001:0> filename_with_spaces = "foo bar.txt"
=> "foo bar.txt"
irb(main):002:0> system "ls -l #{filename_with_spaces}"
ls: bar.txt: No such file or directory
ls: foo: No such file or directory
=> false
Так что, если вы интерполируете переменные в системный вызов, безопаснее предоставить аргументы отдельно:
irb(main):003:0> system "ls", "-l", filename_with_spaces
-rw-r--r-- 1 nobody nobody 9 Feb 1 16:53 foo bar.txt
=> true
Но теперь у нас есть проблема, если мы хотим скрыть вывод.
irb(main):004:0> system "ls", "-l", filename_with_spaces, "> /dev/null"
ls: > /dev/null: No such file or directory
-rw-r--r-- 1 nobody nobody 9 Feb 1 16:53 foo bar.txt
=> false
Мы можем закрыть STDOUT, используя опцию :out => :close
:
irb(main):005:0> system "ls", "-l", filename_with_spaces, :out => :close
=> true
Однако это может вызвать проблемы с некоторыми командами, которые могут пытаться подключиться к STDOUT.
irb(main):006:0> system "echo", "hi there", :out => :close
echo: write: Bad file descriptor
=> false
Чтобы исправить это, мы можем вернуться к перенаправлению вывода, используя File::NULL
, чтобы остаться переносимым:
irb(main):007:0> system "echo", "hi there", :out => File::NULL
=> true