bash:"which adb" returns 没什么,但是 "command -v adb" returns 我期望的

bash: "which adb" returns nothing, but "command -v adb" returns what i'd expect

这是一个一直困扰着我的 bash 怪事。

我在 OSX.

我已经安装了 android SDK,因此 adb 工具位于我的主目录中的一个文件夹中。该文件夹出现在我的路径中,据 env 报告为 ~/Development/android_sdk_latest/platform-tools

adb 本身运行得很好,但是当我执行 which adb 时,结果是空的。如果我这样做 command -v adb,结果是完整路径,正如预期的那样:/Users/me/Development/android_sdk_latest/platform-tools/adb

adb 没有出现在我的别名中。

bash 路径或 which 我在黑暗中有什么微妙之处?

您 运行 在 /bin/bashwhich 命令之间存在微妙的不兼容性。

在我的系统(LinuxMint)上,which命令实际上是一个shell脚本,不是内置命令,它的第一行是#! /bin/sh.这意味着它使用 /bin/sh$PATH 变量的处理。

这取决于 /bin/sh 的设置方式(它有时是 /bin/bash 的符号链接),但一些实验表明 bash 处理文字 ~ 中的字符 $PATH 就好像它是您的主目录的完整路径一样,但 /bin/sh 不是。因为你有

~/Development/android_sdk_latest/platform-tools

作为你的$PATH的元素之一,bash(你的交互shell)可以找到adb命令,但是sh( shell 被 which) 使用。

在某些系统上,显然包括您的 OSX 系统,which 是二进制可执行文件。同样,由于它不是 bash 脚本,因此它不会匹配 bash 对 $PATH.

的处理

我建议进行两项更改。

首先,不要在 $PATH 中放置文字 ~。例如,要将 platform-tools 目录附加到您的 $PATH,而不是这样:

export PATH="$PATH:~/Development/android_sdk_latest/platform-tools" # BAD!

这样做:

export PATH="$PATH:$HOME/Development/android_sdk_latest/platform-tools"

$HOME 将扩展到您的主目录的路径(当您 运行 使用 export 命令时,而不是当您稍后使用 $PATH 时)。 ~ 不会在双引号字符串中扩展。

其次,不使用 which 命令,而是使用 bash 中内置的 type 命令。 type 将遵循您当前 shell 的规则而不是 /bin/sh 的规则,并且它将能够报告 which 无法报告的 shell 函数和别名查看。它有几个有用的命令行选项;在 bash 提示符处键入 help type 以获取详细信息。

bash shell 对 $PATH~ 个字符的处理记录在 bash manual's section on Tilde Expansion.