Ruby: ставит печать stderr результата команды

Мне непонятно, как в Ruby работает «помещает» для вывода команды, которая отправляет свой вывод в stderr.

Посмотрите на этот код:

command="/usr/bin/java -version"
result=`#{command}`

puts result
puts "XX#{result}XX"

Результат:

java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

XXXX

java -version отправляет свой вывод в stderr (я знаю, что для предотвращения этого я должен был использовать 2>&1 в конце команды)

Мой вопрос: переменная «результат» на самом деле пуста, но первая выводит вывод stderr, а вторая выводит стандартный вывод (который пуст). Почему? В чем дело?


person Mario R.    schedule 14.08.2015    source источник
comment
Обратные кавычки по-прежнему запускают команду и печатают ее вывод. захват, возврат обратных кавычек, является стандартным выводом.   -  person Dave Newton    schedule 14.08.2015


Ответы (2)


На самом деле оба оператора puts ничего не печатают. Если вы сделаете это:

puts "YY#{result}YY"
puts "XX#{result}XX"

Вы увидите, что получили YYYY и XXXX.

Причина, по которой вы видите вывод из Java, заключается в том, что сама Java печатает в stderr, который не захватывается Ruby.

person neuronaut    schedule 14.08.2015

Первый puts result печатает только новую строку. Вывод происходит из следующей строки (самой командой, печатающей в stderr)

result=`#{command}`

Вы можете убедиться в этом, удалив все puts ... строки.

person falsetru    schedule 14.08.2015
comment
Да! Я сам себя обманул! Спасибо! - person Mario R.; 14.08.2015