2012-08-13 2 views
3

Резюме: На машине с Windows, как я могу сделать ее так, чтобы оболочка Bourne была активной оболочкой Ruby? Вот что я хотел бы случиться:Как использовать оболочку Bourne как активную оболочку Ruby под Windows

irb> exec('echo $SHELL') 
/bin/sh 

Фактический выход:

irb> exec('echo $SHELL') 
$SHELL 

Что является то, что произойдет, если я пытаюсь выполнить команду вручную в cmd.exe. Согласно документам Ruby, это выглядит так: exec проверок вызовов $RUBYSHELL и $COMSPEC (в указанном порядке?). Я пробовал установить $RUBYSHELL на "C:\Program Files (x86)\Git\bin\sh.exe", где у меня есть копия sh, /bin/sh и /sh, ни одна из которых не работает. Похоже, он в основном игнорирует RUBYSHELL ...

Почему?: Я использую драгоценный камень Ruby, который звонит exec и передает ему результат Shellwords.shelljoin. Этот вызов ускользает от символов, но только для оболочки Bourne. При запуске под Windows 'cmd.exe, он кажется barf на любых экранированных символах цитаты и просто игнорирует их. В результате команда не интерпретируется правильно. Я предполагаю, что другой способ решить мою проблему - сообщить мне, есть ли лучший кросс-платформенный способ выполнения последовательности команд escape, но мне кажется, что моя проблема будет решена, если я смогу сделать sh свою активную оболочку Ruby.

+0

Вы пробовали настройки окна переменные родной среды 'RUBYSHELL' и/или "COMSPEC" (т.е. а не переменные git 'sh')? Я уверен, что ruby ​​/ irb на окнах не имеет привязки mingw, что означает, что он будет считывать родную среду Windows, а не среду mingw. – Casper

+0

@ Каспер Да, вот как я это делаю. Я просто просматриваю панель управления и устанавливаю «RUBYSHELL» равным всем, что я хочу. Кажется, они появляются правильно, когда я запускаю 'env' либо в' cmd.exe', либо 'sh.exe'. – aardvarkk

+0

Вы считали, что переопределяете метод, вызывающий проблемы. Небольшое изменение, чтобы изменить способ, которым символы избегают, чтобы быть более дружественным к Windows. – Jato

ответ

0

Я бы выполнил оболочку непосредственно, например. exec('c:\bin\sh')

Я должен отметить (вы, наверное, знаете это), что переменные среды Windows доступны окружая их с процентными знаками:

irb> exec(`echo %SHELL%`) 
+0

Yep - Я знал о знаках процента в Windows. Надеюсь, что тест покажет, что он корректно работает в 'sh', потому что команда будет правильно распечатывать местоположение должным образом, а не вывод Windows, который выглядел бы как' $ SHELL' на выходе. – aardvarkk

0
exec("sh","-c","echo $SHELL") 

Такой прагматический подход должен быть в состоянии решить дело, в мое окружение это работает так же в различных средах выполнения, например:

mingw32 на ОС Windows 7 64bit рубин 2.1.6p336 (2015-04-13 редакция 50298) [i386-mingw32] ruby 2.1.6p336

OS-X 10.10.3 рубин 2.0.0p451 (2014-02-24 ревизия 45167) [x86_64-darwin13.1.0] ruby 2.0.0p451

Смежные вопросы