Es ist nicht Rubin, es ist deine Hülle.
Viele Shells die erweitern? Zeichen, um ein einzelnes Zeichen in Befehlszeilenargumenten zu finden. Es ist nützlich, wenn Sie eine Reihe von Dateien Name Tempa, TEMP1, TEMPB, ..., temp9, die Sie löschen wollen, aber Sie wollen nicht löschen ‚Tempel‘
% rm temp?
So bin ich Ich nehme an, Sie haben eine Datei oder ein Verzeichnis in Ihrem Arbeitsverzeichnis namens 'z', und die? passt das, also wird es durch die Shell ersetzt.
Normalerweise, wenn in einfachen Anführungszeichen (wie Ihre Ruby-Skript) ist es nicht erweitert bekommen würde, aber da Sie die Fragezeichen zu einem Shell-Befehl vorbei sind, wird es dort erweitert.
% ruby -e 'puts %x[ echo ? ]'
z
%
Sollte Ihnen das gleiche Verhalten zeigen.
Auch, wenn Sie ein paar andere einzelne Zeichen Dateinamen wie ABCD berühren, diejenigen zeigen, sollte:
% touch a b c
% ruby -e 'puts %x[ echo ? ]'
a b c z
%
Wenn Sie dies vermeiden wollen, wenn aus rubinAußen Shell-Befehle aufrufen, müssen Sie um irgendwelchen Strings zu entgehen, die du verpasst hast. Für die meisten Zwecke sollte String#inspect
eine gute genug geben, um zu entkommen.
Welches Betriebssystem ist das? Ich kann unter Windows nicht reproduzieren, ich frage mich, ob deine Shell etwas funky macht. – AShelly