可执行文件和 ./executable 之间的区别

可执行文件和 ./executable 之间的区别

在某些情况下,我需要在 bash 中运行文件时使用./executable而不是 simply 。它们之间到底有什么区别?我怎么知道应该使用哪一个?executable

例如,我adbDEV/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查看当前内容- 示例输出:PATHecho $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对于文件。

相关内容