2016-06-01 5 views
2

Dies ist eine Bash-Seltsamkeit, die mich nervt.bash: "which adb" gibt nichts zurück, aber "command -v adb" gibt zurück, was ich erwarten würde

Ich bin auf OSX.

Ich habe das Android SDK installiert, und als Ergebnis befindet sich das adb Tool in einem Ordner in meinem Home-Verzeichnis. Dieser Ordner erscheint in meinem Pfad, wie von env als ~/Development/android_sdk_latest/platform-tools gemeldet.

adb selbst läuft gut, aber wenn ich tun which adb ist das Ergebnis leer. Wenn ich command -v adb mache, ist das Ergebnis der vollständige Pfad, wie erwartet: /Users/me/Development/android_sdk_latest/platform-tools/adb

adb erscheint nicht in meinen Aliasen.

Welche Subtilität der Bash Pfade oder which bin ich im Dunkeln?

+1

Was gibt Ihnen "type adb"? Und haben Sie einen buchstäblichen '~' Charakter in Ihrem '$ PATH'? –

+0

@KeithThompson - 'adb ist hashed (/ Benutzer/ich/Entwicklung/android_sdk_latest/platform-tools/adb)', und ich denke, ja, tue ich. Ich setze den Pfad nach oben, indem ich ein Skript mit folgender Zeile quelle: 'export PATH =" $ PATH: ~/Entwicklung/android_sdk_latest/platform-tools "' –

Antwort

4

Sie haben eine geringfügige Inkompatibilität zwischen /bin/bash und dem which Befehl festgestellt.

Auf meinem System (Linux Mint), der which Befehl ist eigentlich ein Shell-Skript, kein integrierter Befehl, und seine erste Zeile ist #! /bin/sh. Das bedeutet, dass /bin/sh die $PATH Variable verwendet.

Dies variieren je nachdem, wie /bin/sh eingerichtet ist (es ist manchmal ein symbolischer Link zu /bin/bash), aber ein wenig Experimentieren zeigt, dass bash behandelt einen wörtlichen ~ Charakter in $PATH, als ob es der vollständige Pfad zu Ihrem Home-Verzeichnis war, aber /bin/sh nicht. Da Sie

~/Development/android_sdk_latest/platform-tools 

als eines der Elemente Ihrer $PATH, bash (Ihre interaktiven Shell) haben können Sie den adb Befehl, aber sh (die Schale durch which verwendet) nicht.

Auf einigen Systemen, einschließlich Ihres OSX-Systems, ist which eine binäre ausführbare Datei. Da es sich nicht um ein Bash-Skript handelt, entspricht es nicht der Bash-Behandlung von $PATH.

Ich empfehle zwei Änderungen vorzunehmen.

Erstens, setzen Sie kein Literal ~ in Ihrem $PATH. Um zum Beispiel das platform-tools Verzeichnis auf Ihrem $PATH, anstatt diese anfügen:

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

dies tun:

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

Der $HOME auf den Pfad zu Ihrem Home-Verzeichnis erweitern. ~ wird in Strings mit doppelten Anführungszeichen nicht erweitert.

Zweitens, anstatt den Befehl which zu verwenden, verwenden Sie den Befehl type, der in bash integriert ist.type folgt den Regeln Ihrer aktuellen Shell und nicht denen von /bin/sh, und Shell-Funktionen und Aliasnamen können gemeldet werden, die which nicht sehen kann. Es hat mehrere nützliche Befehlszeilenoptionen; Geben Sie help type an einer Bash-Eingabeaufforderung für Details ein.

Der treatement von ~ Zeichen des bash in $PATH auf Tilde Expansion in den bash manual ‚s Abschnitt dokumentiert.

+0

tot-on! mit der Ausnahme, dass mein 'which' (/ usr/bin/which) eher ein Binary als ein Skript zu sein scheint. danke für den Tipp über $ HOME. Ich habe diese Änderung vorgenommen, und "das" stimmt nun mit "Befehl" überein. Ich wusste nicht über 'Typ'. das ist ein großartiges Werkzeug! –

+0

@orionelenzil: Interessant. Ich nehme an, ich sollte nicht überrascht sein, dass es auf OSX anders ist. Aber ich bin überhaupt nicht überrascht, dass eine (wahrscheinlich C) Implementierung von 'which' auch nicht mit' ~ 'in' PATH' umgehen würde. –