2016-06-01 10 views
2

Это странная странность, которая меня била.bash: «какой adb» ничего не возвращает, но «command -v adb» возвращает то, что я ожидаю

Я нахожусь на OSX.

Я установил SDK android, и в результате инструмент 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 Я в темноте?

+1

Что предлагает вам 'type adb'? И у вас есть буквальный символ '' 'в вашей' $ PATH'? –

+0

@KeithThompson - 'adb hashed (/ Users/me/Development/android_sdk_latest/platform-tools/adb)', и я думаю, да, я знаю. Я установил путь к исходному сценарию с этой строкой: 'export PATH =" $ PATH: ~/Development/android_sdk_latest/platform-tools "' –

ответ

4

Вы столкнулись с тонкой несовместимостью между /bin/bash и командой which.

В моей системе (Linux Mint) команда which на самом деле является скриптом оболочки, а не встроенной командой, а первая строка - #! /bin/sh. Это означает, что он использует обработку /bin/sh переменной $PATH.

Это может варьироваться в зависимости от того, как /bin/sh настроен (это иногда символьная ссылка /bin/bash), но немного экспериментирования показывает, что bash обрабатывает буквальный ~ символа в $PATH, как будто это полный путь к вашей домашней директории, но /bin/sh нет. Поскольку у вас есть

~/Development/android_sdk_latest/platform-tools 

в качестве одного из элементов вашего $PATH, bash (интерактивной оболочки) может найти команду adb, но sh (оболочка используется 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 будет расширяться на пути к вашей домашней директории. ~ не расширяется в строках с двойными кавычками.

Во-вторых, вместо использования команды which используйте команду type, которая встроена в bash.type будет следовать правилам текущей оболочки, а не /bin/sh, и он сможет сообщать о функциях оболочки и псевдонимах, которые which не может видеть. Он имеет несколько полезных параметров командной строки; тип help type при запросе bash для деталей.

пропитки

оболочки Bash по ~ символов в $PATH описана в разделе bash manual «s на Tilde Expansion.

+0

dead-on! , за исключением того, что мой 'which' (/ usr/bin/который) представляется двоичным, а не скриптом. спасибо за отзыв о $ HOME. Я сделал это изменение и 'which' теперь соглашается с' command'. Я не знал о 'type'. это отличный инструмент! –

+0

@orionelenzil: Интересно. Полагаю, я не удивлюсь, что на OSX это по-другому. Но я вовсе не удивлен, что (возможно, C) реализация 'which' также не обрабатывала' ~ 'в' $ PATH'. –