为什么在某些Rails指令中需要./script/generate而不是script / generate?

时间:2011-03-12 09:31:24

标签: bash shell

在Bash或Windows(或任何其他shell)中,是否需要执行

./script/generate scaffold foo name:string

而不是仅使用

script/generate  ...

?我有时会看到第一种形式,但第二种形式总是适用于我,在Mac OS X或Ubuntu上,即使PATH不包含.(当前目录)

第二种形式总是可行,所以第一种形式真的不需要吗?我认为对于可执行文件,我们有时会使用./a.out来运行它...但似乎script/generate可能不需要前面的./

4 个答案:

答案 0 :(得分:3)

他们的意思完全相同。

  

从当前目录开始,选择一个名为“script”的子目录,并在其中选择一个名为“generate”的可执行文件并运行它。

不同之处在于,使用./显式指定当前目录,没有它,它是隐式的。

答案 1 :(得分:1)

POSIX shell中有两种调用语法:

  • 通过指定名称然后在PATH enviornment变量中搜索来运行程序 - 当程序名称没有斜杠(/)时使用此程序。
  • 通过手动指定程序的完整路径来运行程序 - 绝对(以/开头的路径)或相对路径(以任何其他符号开头的路径)。当程序的名称包含至少一个/时选择此项 - 因此它是路径,而不仅仅是文件名。

在您的情况下,通过指定程序的路径,使用变体#2执行调用 - script/generate./script/generate的两种方式。 ./是当前目录的别名,在某些情况下,它必须存在(例如,使用cd命令时,您不能仅在没有参数的情况下说cd并期望更改进入当前目录 - cd保留不带参数的调用以更改为$HOME目录 - 但如果要进入当前目录,则可以调用cd ./,但在这种情况下不需要调用

答案 2 :(得分:0)

您可能需要查看4 Ways of Executing a Shell ScriptShell Script Execution Guidlines。两种风格之间的主要区别是:

script/generate  ...
如果脚本的父目录不在您当前的PATH环境中,

将无效。 (这肯定取决于shell的查找方法是如何实现的。可能有一些实现 - 到最后的手段 - 在你当前的工作目录中查找)。

修改
好吧,我已经对此做过一些研究,因为我自己似乎并不知道有什么区别。所以,这就是我所得到的:

./(点斜杠)语法是当前工作目标的绝对路径的别名,因此 - 例如/home/peter/script是cwd -

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

扩展为/home/peter/script/myscript。斜线点别名基本上为shell提供了查找可执行文件/脚本的位置的提示。

这个提示是必不可少的,这就是

的原因
peter@linux:/home/peter$script/myscript

同样适用

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

不会。前者通过提供某种参考点(即script目录)来帮助shell找到正确的可执行文件/脚本。另一方面,后者使shell有一个可能模糊的命令,因为在用户的$ PATH中可能有一个同名脚本。

所以,为了达到目的,你要求区别的两种风格基本相同 - 给shell提供了查找可执行文件/脚本的提示。然后shell可以明确地解析正确的文件,并很乐意执行它。

度过愉快的一天。

答案 3 :(得分:-1)

这些答案没有错,只是它们太长了 - 它只是关于你的路径。如果您的路径包含'。'那么任何一种方式都会起作用

这就是说,这是一个坏习惯。'出于安全原因,请在PATH中使用' ./'