Почему вопросительный знак интерпретируется как "z" в Ruby - PullRequest
2 голосов
/ 06 марта 2009

Почему эта строка выводит "z" вместо "?"

$ ruby ​​-e 'помещает% x [echo # {"?"}]'

Предположим, что выражение внутри # {...} является переменной, которая может иметь значение "?". Как мне изменить этот скрипт так, чтобы вместо «z» выводился знак вопроса?

(Пожалуйста, прости заголовок этого вопроса - я еще не понимаю, что здесь происходит достаточно хорошо, чтобы дать более описательный заголовок.)

Ответы [ 2 ]

7 голосов
/ 07 марта 2009

Это не рубин, это твоя оболочка.

Многие снаряды расширяют? символ для соответствия одному символу в аргументах командной строки. Это полезно, если у вас есть куча файлов с именами 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 должен давать достаточно хороший выход.

1 голос
/ 06 марта 2009

Это не так?

irb(main):001:0> puts %x[echo #{"?"}]
?
=> nil

Использование # {} даст вам значение любых переменных внутри - я не уверен, почему вы используете его вместо

puts %x[echo "?"]

или просто

puts '?'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...