bash:"哪个adb"什么都不返回,但"command -v adb"返回我期望的内容

ori*_*zil 5 macos bash command path which

这是一种困扰我的狂热怪异.

我在OSX上.

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

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

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

什么微妙的bash路径或which我在黑暗中?

Kei*_*son 9

/bin/bashwhich命令之间遇到了微妙的不兼容.

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

这可能会有所不同,具体取决于/bin/sh设置方式(它有时是符号链接/bin/bash),但是一些实验表明bash处理文字~字符$PATH就好像它是主目录的完整路径,但却/bin/sh没有.既然你有

~/Development/android_sdk_latest/platform-tools
Run Code Online (Sandbox Code Playgroud)

作为您的元素之一$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!
Run Code Online (Sandbox Code Playgroud)

做这个:

export PATH="$PATH:$HOME/Development/android_sdk_latest/platform-tools"
Run Code Online (Sandbox Code Playgroud)

$HOME将扩大到路径到您的主目录.export不会在双引号字符串中展开.

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

bash shell中对which字符的处理help type记录在bash手册Tilde Expansion部分中.