Как игнорировать вывод для параметризованного системного вызова Ruby - PullRequest
1 голос
/ 21 октября 2019

Я нашел некоторый код , который позволяет мне запускать Applescript из Ruby через системные вызовы:

system 'osascript', *script.split(/\n/).map { |line| ['-e', line] }.flatten

Он прекрасно работает, но это не совсем то, что мне нужно.

Я хочу изменить системный вызов так, чтобы стандартный вывод игнорировался.

Я начал с добавления параметра 1>/dev/null:

system 'osascript', *script.split(/\n/).map { |line| ['-e', line] }.flatten, "1>/dev/null"

Это не работает в качестве третьего параметракажется, игнорируется.

Затем я удалил параметризованный вызов и использовал интерполяцию строки:

system "osascript #{*script.split(/\n/).map { |line| ['-e', line] }.flatten} 1>/dev/null"

, которая вызвала синтаксическую ошибку.

Затем я попробовал различные попытки переместить вещи, которые в основномпроизвел другие синтаксические ошибки.

Какой правильный синтаксис для игнорирования вывода системы в этом случае?

Ответы [ 2 ]

3 голосов
/ 21 октября 2019

Это было бы проще, если бы вы переключились с Kernel#system на Open3. Методы в Open3 дают вам удобный контроль над stdin, stdout и stderr без необходимости возиться, вы даже можете передать свой сценарий в osascript через stdin, не разбивая его на части и используя несколько переключателей -e.

Возможно, что-то вроде этого:

out, error, status = Open3.capture3('osascript', stdin_data: script)

А если вы хотите игнорировать stdout и stderr, используйте переменные-заполнители:

_, _, status = Open3.capture3('osascript', stdin_data: script)
*_, status = Open3.capture3('osascript', stdin_data: script)

А если вам не нужен stdout, stderrили статус:

Open3.capture3('osascript', stdin_data: script)

Но ваша совесть должна сказать вам хотя бы проверить статус.

2 голосов
/ 21 октября 2019

Доступные параметры для system, exec и spawn задокументированы в Kernel#spawn, включая параметры перенаправления. Чтобы перенаправить стандартный вывод на /dev/null, вы должны использовать:

system('...', out: '/dev/null')

или через File::NULL:

system('...', out: File::NULL)
...