Как мне указать оболочку, которая будет использоваться для системного вызова ruby? - PullRequest
9 голосов
/ 06 августа 2009

Я пытаюсь запустить команды из ruby ​​через system (или с помощью обратных галочек), но сталкиваюсь с проблемами. Когда я пытаюсь вызвать команду, оболочка не может найти ее, хотя я знаю, что она работает, если я вызываю ее прямо. Например:

`zip`
>> sh: zip: command not found

Проблема, похоже, в том, что ruby ​​использует оболочку sh, в которой $PATH настроен неправильно, а не bash, и я не уверен, почему. Пользователь, под которым запущено мое приложение, настроен на использование bash по умолчанию.

Можно ли сказать ruby ​​использовать bash вместо sh?

Ответы [ 3 ]

9 голосов
/ 06 августа 2009

Насколько я знаю, единственный способ сделать это - явно вызвать оболочку, например,

`bash -c zip`

или

`#{ ENV['SHELL'] } -c zip`

Или с системой: system("bash", "-c", command)

Однако ruby ​​(и все процессы, порожденные ruby) должны наследовать среду родительских процессов и, таким образом, иметь $ PATH, установленный правильно, даже при использовании другой оболочки. Возможно, вы запускаете ruby ​​из задания cron, скрипта инициализации или чего-то подобного, где PATH просто не установлен правильно?

4 голосов
/ 06 августа 2009

Я предполагаю, что Ruby использует функцию system() C, которая использует /bin/sh. В большинстве систем /bin/sh - это просто символическая ссылка на другую оболочку, так что вы можете перейти на что угодно

0 голосов
/ 06 августа 2009

Почему бы просто не указать полный путь к исполняемому файлу zip.

...