在某些情况下,我需要在 bash 中运行文件时使用./executable
而不是 simply 。它们之间到底有什么区别?我怎么知道应该使用哪一个?executable
例如,我adb
在DEV/ADT/sdk/platform-tools
文件夹中有一个可执行文件。
在 bash 中,如果我输入adb
并运行它,我会收到错误:The program 'adb' is currently not installed. You can install it by typing: apt-get install android-tools-adb
但如果我输入./adb
,它就能完美运行。
答案1
第一个关键点是./
指定当前目录或工作目录,即您现在所在的目录,也是您键入命令pwd
(打印工作目录)时看到的目录。考虑到这一点,bash 的工作方式有两种:
如果您指定一个裸可执行文件(例如
adb
没有给出目录),那么 bash 会在系统 PATH 中列出的目录中搜索该名称的可执行文件,并执行找到的第一个这样的可执行文件。要查看系统 PATH 中有哪些目录,请运行
echo $PATH
如果您指定带有目录的可执行文件(如
./
您的情况),则 bash 只会在该目录中查找可执行文件。如果不存在,它会停止并显示错误。
在您的例子中,您位于DEV/ADT/sdk/platform-tools
可执行文件 所在的文件夹中adb
。因此,当您键入 时./adb
,bash 会在当前目录中查找adb
,如果找到,则会执行它。
或者,当您输入 时adb
,bash 会查看 PATH 中的目录。由于DEV/ADT/sdk/platform-tools
显然不在 PATH 中,因此它找不到可执行文件并发出警告。
人们常常通过将当前目录放入他们的 PATH 中来避免这个问题,例如:
PATH="$PATH:."
完成此操作后,当您输入裸可执行文件的名称(例如)时adb
,bash 将像以前一样沿着 PATH 查找它。但由于 PATH 现在包括当前目录,因此它也会在那里查找。
个人用户通常会将添加.
到 PATH 中。由于 root 意外运行错误的可执行文件时会更加危险,因此通常不会对 root 执行此操作。
答案2
原因是,如果您不以 开头./
,它将搜索PATH
-您可以通过运行executable
查看当前内容- 示例输出:PATH
echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/wilf/.local/bin:/usr/games
因此,如果你想添加DEV/ADT/sdk/platform-tools
到你的 PATH,请添加以下内容~/.bash_profile
(您可能需要source ~/.bash_profile
先运行,或者注销并登录):
PATH=$PATH:DEV/ADT/sdk/platform-tools
另一个例子~/.local/bin
:
PATH=$PATH:$HOME/.local/bin
如果你在其前面./
加上echo $PWD
(您可以通过、等找到它pwd
)对于文件。