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


13

这是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

Answers:


20

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

$ ./jdev

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

(请参阅linux / unix中的文件权限

当您以

$ jdev

那么最有可能jdev在系统上某处安装了您的计算机$PATH(例如/usr/bin/or /bin//usr/local/bin/

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

$ which find
/usr/bin/find

1
同样,which如果没有给出路径,该实用程序并不能告诉您将使用哪个可执行文件。
彼得2013年

@peterph编辑了我的答案。
Patryk

7
最好使用它type来检查特定命令启动的内容。原因which将在$ PATH中的某个位置显示一个二进制文件,但是绝对可以将其别名为另一个二进制文件。
2013年

@rush我刚刚试过了,它不会工作,你说:[~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim。虽然zsoelim -> soelim
Patryk

2
@Patryk我认为匆忙的意思是shell别名/函数,which没有机会找到它,因为它是一个独立的二进制文件,无法访问正在运行的shell环境(我指的是别名和函数,而不仅仅是环境变量) ,其中一些是继承的)。
彼得

8

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

如果名称中存在斜杠,则不会发生,该名称将作为执行命令的路径(尽管某些shell(如zshallow别名或函数)的名称中会包含斜杠,然后优先使用)。

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

要知道外壳将运行什么,请使用type命令。不要使用which通常不会执行您认为会做命令,并且csh最好保留其传统。


为什么不是“哪个”而是“类型”?
极客

@Geek,这是一个常见问题在这里,看到unix.stackexchange.com/search?q=[which]+type
斯特凡Chazelas

您提供了正确的链接吗?
极客

这是该网站上的搜索结果,足以证明这是一个常见问题。这些问题的许多答案都会告诉您为什么不使用which。例如,见unix.stackexchange.com/questions/16693/...
斯特凡Chazelas

2

我建议使用Zsh的内置“ where”(比“哪个”更好)来查看如何以及以什么顺序找到别名,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:~ %

1

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

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

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

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

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

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


您的术语令人困惑。jdev孤独也是一条相对的道路。规则是:如果不包含斜杠,则在别名,函数和中进行$PATH查找,否则,直接在文件系统上进行查找(尽管某些shell允许使用其名称中带有/的别名或函数,然后使用优势)。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.