仅按名称运行可执行文件与在其前面附加点/斜杠有什么区别?

Gee*_*eek 13 process command

这是ls -all命令的输出:

-rwxr----- 1 subhrcho dba  3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba  1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba   347 Mar  6  2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba   821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba   584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba  4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba  5047 Dec  6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe
Run Code Online (Sandbox Code Playgroud)

现在,当我运行jdev它运行不同版本的甲骨文JDveloper当我运行它比./jdev..Why会这样呢?

Pat*_*ryk 20

当您运行可执行文件(或者更确切地说是在 unix/linux 世界中 - 具有可执行权限/标志的文件)时,如下所示:

$ ./jdev

然后标记为.要在工作目录(您当前所在的目录)中运行一个文件,该文件已命名jdev并且对启动它的用户具有可执行权限(您必须注意它仍然可以是指向其他文件,您可以通过ls -l jdev在终端中键入来检查)

(参见linux/unix 中的文件权限

当你运行它时

$ jdev

那么很可能jdev在系统上的某个地方安装了它并且您将其安装在$PATH(例如/usr/bin//bin//usr/local/bin/

正如peterph所说:您可以使用whichto 指向正在使用特定命令启动的可执行文件,例如:

$ which find
/usr/bin/find
Run Code Online (Sandbox Code Playgroud)

  • 最好使用 `type` 来检查特定命令启动的内容。因为`which` 只会显示$PATH 中某处的一个二进制文件,但是它可能会被别名为绝对另一个二进制文件。 (7认同)
  • @Patryk 我认为 rush 是指 shell 别名/函数,“which”没有机会找到,因为它是一个独立的二进制文件,无法访问正在运行的 shell 环境(我指的是别名和函数,而不仅仅是环境变量,其中一些是继承的)。 (2认同)

Sté*_*las 8

如果您在 shell 中调用名称中没有斜线的命令,则会在 shell 别名、函数和$PATH环境变量中提供的路径列表中查找该命令。(请注意,您可以在 中拥有当前工作目录(指定为.或空字符串)或任何相关目录$PATH,但出于安全原因,不建议这样做)。

如果名称中有斜杠,则不会发生这种情况,名称将作为执行命令的路径(尽管某些 shellzsh允许别名或函数在其名称中包含斜杠,然后优先)。

因此,如果您想运行foo当前工作目录中名为的命令,您必须想出一个包含斜杠的名称。./foo是最明显的。您也可以使用完整路径,或者../dir/foo...

要知道 shell 将运行什么,请使用该type命令。不要使用which通常不会做你认为它会做的事情命令csh并且是最好不要管它的遗产。