Почему ./script/generate требуется вместо script / generate в некоторых инструкциях Rails? - PullRequest
2 голосов
/ 12 марта 2011

Внутри Bash или Windows (или любой другой оболочки) это необходимо сделать

./script/generate scaffold foo name:string

вместо использования

script/generate  ...

? Иногда я вижу первую форму, но вторая форма всегда работает для меня, в Mac OS X или Ubuntu, даже если PATH не включает . (текущий каталог)

Так может ли вторая форма работать всегда, так что первая форма действительно не нужна? Я думаю, что для исполняемого файла мы иногда используем ./a.out, чтобы запустить его ... но кажется, что script/generate не нужно ./ впереди?

Ответы [ 4 ]

3 голосов
/ 12 марта 2011

Они означают одно и то же.

Начиная с текущего каталога, выберите подкаталог с именем «script» и в нем исполняемый файл с именем «generate» и запустите его.

Разница в том, что с ./ вы явно указываете текущий каталог, а без него он неявный.

1 голос
/ 13 марта 2011

В оболочке POSIX есть 2 синтаксиса вызовов:

  • Запуск программы с указанием имени и последующим поиском в переменной PATH enviornment - эта используется, когда имя программы не имеет косой черты (/).
  • Запуск программы с указанием полного пути к ней вручную - абсолютно (путь начинается с /) или относительно (путь начинается с любого другого символа). Этот выбирается, когда имя программы включает хотя бы один / - таким образом, это путь, а не просто имя файла.

В вашем случае оба способа вызова - script/generate или ./script/generate выполняются с использованием варианта # 2 - путем указания пути к программе. ./ является псевдонимом текущего каталога, и в некоторых случаях он должен присутствовать (например, при использовании команды cd вы не можете просто сказать cd без аргумента и ожидать перехода в текущий каталог - cd резервирует вызов без аргументов, чтобы перейти в каталог $HOME, но вы можете позвонить cd ./, если хотите перейти в текущий каталог), но в этом случае это не требуется.

0 голосов
/ 12 марта 2011

В этих ответах нет ничего плохого, за исключением того, что они слишком длинные - это просто ваш путь. Если ваш путь включает в себя «.» тогда в любом случае сработает

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

0 голосов
/ 12 марта 2011

Возможно, вы захотите взглянуть на 4 способа выполнения сценария оболочки и Руководства по выполнению сценария оболочки . Основное различие между обоими стилями:

script/generate  ...

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

EDIT
Хорошо, я провел некоторое исследование по этому вопросу, так как сам, похоже, не знал, в чем разница. Итак, вот к чему я пришел:

Синтаксис ./ (точка косая черта) является псевдонимом для абсолютного пути текущей рабочей директории, так что, например, с помощью. /home/peter/script являющийся cwd -

peter@linux:/home/peter/script$./myscript

расширен до /home/peter/script/myscript. Псевдоним косой черты в основном дает оболочке подсказку, где найти исполняемый файл / скрипт.

Это намек, что важно, и именно поэтому

peter@linux:/home/peter$script/myscript

работает так же, как

peter@linux:/home/peter/script$myscript

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

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

Хорошего дня.

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