你遇到了两者之间微妙的不兼容/bin/bash
和which
命令。
在我的系统(Linux Mint)上,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
(使用的外壳which
) 不能。
在某些系统上,显然包括您的 OSX 系统,which
是一个二进制可执行文件。再次强调,由于它不是 bash 脚本,因此它不会与 bash 的处理方式相匹配$PATH
.
我建议进行两项更改。
首先,不要输入文字~
在你的$PATH
。例如,要附加platform-tools
目录到你的$PATH
,而不是这个:
export PATH="$PATH:~/Development/android_sdk_latest/platform-tools" # BAD!
do this:
export PATH="$PATH:$HOME/Development/android_sdk_latest/platform-tools"
The $HOME
将扩展到您的主目录的路径(当您运行export
命令,而不是当您使用$PATH
之后)。~
不在双引号字符串内扩展。
其次,而不是使用which
命令,使用type
内置命令bash
. type
将遵循您当前 shell 的规则,而不是/bin/sh
,并且它将能够报告 shell 函数和别名which
是无法看到的。它有几个有用的命令行选项;类型help type
在 bash 提示符下了解详细信息。
bash shell 处理~
中的字符$PATH
记录在bash手册 https://www.gnu.org/software/bash/manual/的部分波形符扩展 https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html.