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

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

这是命令的输出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

现在,当我运行它时,jdev它会运行不同版本的Oracle JDveloper比我运行它时./jdev...为什么会这样?

答案1

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

$ ./jdev

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

( 看linux/unix下的文件权限

当你运行它时

$ jdev

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

作为彼得夫声明:您可以使用whichto 来指向使用特定命令启动的可执行文件,例如:

$ which find
/usr/bin/find

答案2

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

如果名称中存在斜杠,则不会发生这种情况,该名称将被视为执行命令的路径(尽管某些 shell 允许zsh别名或函数的名称中包含斜杠,从而优先考虑)。

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

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

答案3

我建议使用 Zsh 的内置“where”(比“which”更好)来查看如何以及以何种顺序找到别名、shell 内置程序或其他任何内容,以便 $PATH ;-)

这是一个可以更好地理解事物以及如何选择的示例:

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %

答案4

尽管这可能取决于您的 shell,但规则通常是:

  • 如果您提供相对或绝对路径,则将使用该路径。./jdev是相对路径,因为.代表当前目录(事实上,ls -all .会给你相同的ls -all)。如果这样做/usr/bin/tool/,则您使用的是绝对路径。在这些情况下,将执行指向的文件。

  • 如果您不提供路径,而仅提供名称,则会在目录中$PATH搜索您尝试运行的工具。

如果当前目录中有一个文件与 中某些目录中的文件同名$PATH,并且通过在其名称前面加上它来运行它./,那么您将有效地运行另一个文件。

也许另一个问题是您实际上希望jdev在当前目录中运行可执行文件。除非您更改$PATH为包含.,否则这根本不是您应该期待的事情......

...并且将其包含在那里仍然不是一个好主意.,如果您这样做,请至少将其放在最后,以便$PATH始终首先搜索其余部分 - 想象一下您位于共享网络目录上并且有人决定在那里放置一个邪恶的二进制文件ls,因为如果$PATH以 开头.,一个简单的二进制文件ls -lah就足以攻击您的系统。

相关内容