Это не рубин, это твоя оболочка.
Многие снаряды расширяют? символ для соответствия одному символу в аргументах командной строки.
Это полезно, если у вас есть куча файлов с именами tempA, temp1, tempB, ..., temp9, которые вы хотите удалить, но не хотите удалять «temple»
% rm temp?
Итак, я предполагаю, что у вас есть файл или каталог в вашем рабочем каталоге с именем 'z', а? соответствует этому, поэтому он заменяется оболочкой.
Обычно, когда внутри одинарных кавычек (как ваш скрипт ruby) он не раскрывается, но поскольку вы передаете вопросительный знак команде оболочки, он раскрывается там.
% ruby -e 'puts %x[ echo ? ]'
z
%
Должен показать вам то же поведение.
Кроме того, если вы дотронетесь до пары имен других односимвольных имен, таких как bcd, они также должны появиться:
% touch a b c
% ruby -e 'puts %x[ echo ? ]'
a b c z
%
Если вы хотите избежать этого при вызове внешних команд оболочки из ruby, вам придется избегать любых строк, которые вы пропускаете. Для большинства целей String#inspect
должен давать достаточно хороший выход.