Ruby выполняет расширение оболочки, когда% x используется с одним аргументом (как вы делаете).
Вот мое предположение относительно того, что происходит:
Ruby сканирует команду, чтобы определить, существуют ли какие-либо специальные символы, которые могут привести к необходимости выполнения расширения оболочки, и в этом случае она вызывает оболочку для этого. Во втором примере одинарных кавычек достаточно, чтобы Ruby захотел вызвать оболочку для расширения, отсюда и ответвление. В первом примере Ruby может определить, что расширение оболочки не требуется, так как команда не содержит специальных символов (после раскрытия переменной), следовательно, нет разветвления. Разница между этими двумя версиями, вероятно, связана с внутренним изменением того, как ruby пытается определить, необходимо ли расширение оболочки. Я получаю форк для второго примера на ruby 1.8.5 на 32-битной машине.
[EDIT]
Хорошо, я взглянул на исходный код для ruby 1.8.4 и 1.8.6, и обе версии используют одни и те же критерии, чтобы определить, следует ли вызывать оболочку для выполнения расширения оболочки, если существует какой-либо из следующих символов в командной строке оболочка будет вызвана, если указан один аргумент для% x:
*?{}[]<>()~&|\\$;'`"\n
Ruby фактически вызывает оболочку в обоих случаях (в примере, который содержит кавычки), причина, по которой вы видите различные выходные данные pstree
, связана с различиями в команде sh
на разных компьютерах, один fork
, другой нет. Чтобы убедиться в этом, выполните эту команду на обеих машинах:
/bin/sh -c "pstree $$"
Это команда, которую Ruby использует для выполнения pstree
в примере с кавычками на обеих машинах. Вы должны увидеть bash---pstree
на 32-битной машине и bash---sh---pstree
на другой.
Так что теперь мне интересно, что привело вас к обнаружению этой разницы и вызывает ли она проблему?