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/bash
和 which
命令之间存在微妙的不兼容性。
在我的系统(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.
中
这是一个一直困扰着我的 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/bash
和 which
命令之间存在微妙的不兼容性。
在我的系统(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.