So verwenden Sie den Befehl what unter Linux

Der Linux-Befehl what identifiziert die ausführbare Binärdatei, die gestartet wird, wenn Sie einen Befehl an die Shell ausgeben. Wenn Sie verschiedene Versionen desselben Programms auf Ihrem Computer haben, können Sie diese verwenden, um herauszufinden, welche die Shell verwenden wird.

Binärdateien und Pfade

Wenn Sie versuchen, ein Programm oder einen Befehl über das Terminalfenster auszuführen, wird die Shell (normalerweise Bash auf modernen Distributionen) muss diesen Befehl finden und starten. Einige Befehle, wie z CD, Geschichte, und pwd, sind in die Shell integriert, sodass Bash nicht allzu hart arbeiten muss, um diese zu finden.

Aber wie findet Bash andere Befehle, Programme und externe eigenständige Binärdateien? Nun, Bash verwendet den Pfad, der eigentlich eine Sammlung von Pfaden ist, von denen jeder auf ein Verzeichnis zeigt. Es durchsucht dann jedes dieser Verzeichnisse nach einer ausführbaren Datei, die dem Befehl oder Programm entspricht, das Sie ausführen möchten. Wenn es einen findet, startet Bash es und bricht die Suche ab.

Sie können echo verwenden, um die Umgebungsvariable $PATH zu überprüfen und die Verzeichnisse in Ihrem Pfad anzuzeigen. Geben Sie dazu Folgendes ein und drücken Sie dann die Eingabetaste:

echo $PATH

Der

Die Ausgabeliste trennt jeden Pfad durch Doppelpunkte (:). Auf dem von uns verwendeten Computer durchsucht Bash die folgenden Verzeichnisse in dieser Reihenfolge:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/Behälter
/user/spiele
/usr/local/games
/schnappen/bin

Es gibt viele Ordner namens /sbin und /bin im Dateisystem, was zu Verwirrung führen kann.

Beobachte diese Pfade

Nehmen wir an, wir haben eine aktualisierte Version eines Programms namens htg. Es befindet sich in unserem aktuellen Verzeichnis und wir können es ausführen, indem wir den folgenden Befehl eingeben:

  So installieren Sie den Gimp-Bildeditor unter Linux

./htg

Der

Es ist kein großes Programm – es gibt nur die Versionsnummer aus und wird dann geschlossen. Die neue Version ist 1.2.138.

Um ein Programm im aktuellen Arbeitsverzeichnis auszuführen, müssen Sie „./“ vor dem Programmnamen eingeben, damit Bash weiß, wo es zu finden ist.

Da wir dieses spezielle Programm von einem beliebigen Verzeichnis aus ausführen möchten, verschieben wir die ausführbare Datei in das Verzeichnis /usr/bin. Bash findet dieses Programm im Pfad und führt es für uns aus.

Wir brauchen weder die ausführbare Datei in unserem aktuellen Verzeichnis, noch müssen wir „./“ vor dem Programmnamen eingeben, wie unten gezeigt:

sudo mv htg /usr/bin

Der

Versuchen wir nun, das Programm auszuführen, indem Sie Folgendes eingeben:

htg

Der

Etwas läuft, aber es ist nicht unser neues, aktualisiertes Programm. Es ist vielmehr die ältere Version 1.2.105.

Welcher Befehl

Das Problem, das wir oben gezeigt haben, ist, warum der Befehl what wurde gestaltet.

In diesem Beispiel verwenden wir which und übergeben den Namen des zu untersuchenden Programms als Befehlszeilenparameter:

which htg

Der

die meldet, dass eine Version von htg im Verzeichnis /usr/local/bin gefunden wurde. Da dieser Ort im Pfad vor dem Verzeichnis erscheint, in das wir das aktualisierte htg verschoben haben, verwendet Bash diese frühere Version des Programms.

Wenn wir jedoch die Option -a (all) wie unten gezeigt verwenden, wird die Suche fortgesetzt, auch wenn eine Übereinstimmung gefunden wird:

which -a htg

Der

Es listet dann alle Übereinstimmungen in einem der Verzeichnisse im Pfad auf.

  So vereinfachen Sie DD mit GdiskDump unter Linux

Das ist also das Problem – es gibt eine frühere Version des Programms in einem Verzeichnis, das sich auch im Patch befindet. Und dieses Verzeichnis wird vor dem Verzeichnis durchsucht, in dem wir die neue Version des Programms abgelegt haben.

Zur Überprüfung können wir Folgendes eingeben und jede Version des Programms explizit ausführen:

/usr/local/bin/htg
/usr/bin/htg

Dies erklärt das Problem und die Lösung ist einfach.

Eigentlich haben wir Optionen. Wir können entweder die alte Version im Verzeichnis /use/local/bin löschen oder von /usr/bin nach /usr/local/bin verschieben.

Sehen Sie sich diese Ergebnisse an

Zwei Ergebnisse bedeuten nicht unbedingt zwei Binärdateien.

Schauen wir uns ein Beispiel an, in dem wir den Befehl what mit der Option -a (all) verwenden und nach Versionen des Programms less suchen:

which -a less

Der

was meldet zwei Standorte, die eine Version des Programms less beherbergen, aber stimmt das? Es wäre seltsam, zwei verschiedene Versionen (oder dieselbe Version an mehreren Standorten) von less auf einem Linux-Computer installiert zu haben. Wir werden also nicht die Ausgabe akzeptieren, von der. Lassen Sie uns stattdessen etwas tiefer graben.

Wir können die Optionen ls, -l (lange Auflistung) und -h (für Menschen lesbar) verwenden, um zu sehen, was vor sich geht:

ls -lh /usr/bin/less

Der

Die Dateigröße wird mit neun Byte angegeben! Das ist definitiv keine vollständige Kopie von weniger.

Das erste Zeichen der Auflistung ist ein „l“. Eine normale Datei hätte als erstes Zeichen einen Bindestrich (-). Das „l“ ist ein Symbol, das symbolische Verbindung bedeutet. Wenn Sie dieses Detail übersehen haben, zeigt das Symbol –> auch an, dass dies a . ist symbolischer Link, die Sie sich als eine Art Abkürzung vorstellen können. Dieser zeigt auf die Kopie von less in /bin.

  So erstellen Sie ein einfaches LVM-Volume unter Linux

Versuchen wir es noch einmal mit der Version von less in /bin:

ls -lh /bin/less

Der

Dieser Eintrag ist offensichtlich eine „echte“ ausführbare Binärdatei. Das erste Zeichen der Auflistung ist ein Bindestrich (-), was bedeutet, dass es sich um eine normale Datei handelt, und die Dateigröße beträgt 167 KB. Es wird also nur eine Kopie von less installiert, aber es gibt einen symbolischen Link von einem anderen Verzeichnis darauf, den die Bash auch findet, wenn sie den Pfad durchsucht.

Mehrere Befehle gleichzeitig prüfen

Sie können mehrere Programme und Befehle an welche übergeben, und sie werden der Reihe nach überprüft.

Wenn Sie beispielsweise Folgendes eingeben:

which ping cat uptime date head

Der

die die Liste der Programme und Befehle durcharbeitet, mit denen Sie es geliefert haben, und das Ergebnis für jedes auflistet.

Welches ist welches?

Wenn Sie dazu neigen, können Sie auch welche verwenden, indem Sie Folgendes eingeben:

which which

Abgesehen davon, dass Sie aus Neugier im Linux-Dateisystem herumstöbern, was am nützlichsten ist, wenn Sie ein Verhalten von einem Befehl oder Programm erwarten, aber ein anderes erhalten.

Sie können die in diesen Fällen verwenden, um zu überprüfen, ob der Befehl, den Bash startet, der ist, den Sie verwenden möchten.