Verwendung des Befehls which unter Linux


Linux which Befehl gibt die ausführbare Binärdatei an, die gestartet wird, wenn Sie einen Befehl an die Shell senden. Wenn Sie verschiedene Versionen desselben Programms auf Ihrem Computer haben, können Sie verwenden which 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 Schlagen auf modernen Distributionen) muss diesen Befehl finden und ausführen. Einige Befehle, wie z CD, die Geschichte, und pwdsind in die Shell eingebaut, damit Bash nicht zu hart arbeiten muss, um sie zu finden.

Aber wie findet Bash andere eigenständige externe Befehle, Programme und Binärdateien? Nun, Bash verwendet den Pfad, der eigentlich eine Sammlung von Pfaden ist, die jeweils auf ein Verzeichnis verweisen. Anschließend wird in jedem dieser Verzeichnisse nach einer ausführbaren Datei gesucht, die dem Befehl oder Programm entspricht, das Sie ausführen möchten. Als er einen findet, wirft Bash ihn und gibt die Suche auf.

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

echo $PATH


Die Ausgabeliste trennt jeden Pfad durch einen Doppelpunkt (:). Auf dem von uns verwendeten Computer sucht Bash in dieser Reihenfolge nach den folgenden Verzeichnissen:

  • /usr/local/sbin
  • /usr/local/bin
  • /usr/sbin
  • /usr/bin
  • /sbin
  • /bin
  • /user/games
  • /usr/local/games
  • /snap/bin

Es werden viele Ordner aufgerufen /sbin und /bin im Dateisystem, was verwirrend sein kann.

Schau dir diese Pfade an

Angenommen, wir haben eine aktualisierte Version eines Programms namens htg. Es befindet sich in unserem aktuellen Verzeichnis und kann durch Ausführen des folgenden Befehls ausgeführt werden:

./htg 

Es ist nicht wirklich ein Programm – es druckt nur die Versionsnummer und wird dann beendet. 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 bestimmte Programm von einem beliebigen Verzeichnis aus ausführen möchten, verschieben wir die ausführbare Datei in das /usr/bin Telefonbuch. Bash findet dieses Programm im Pfad und führt es für uns aus.

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

Verwandt :  So installieren Sie ein Mail-Plugin unter macOS

sudo mv htg /usr/bin

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

htg


Etwas funktioniert, aber es ist nicht unser neues aktualisiertes Programm. Es ist vielmehr die alte Version 1.2.105.

Der Befehl, der

Das Problem, das wir oben gezeigt haben, ist, warum die which Kommandant wurde konzipiert.

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

which htg

which berichtet, dass er eine Version von gefunden hat htg in dem /usr/local/bin Telefonbuch. Da dieser Speicherort im Pfad vor dem Verzeichnis angezeigt wird, in das wir das Update verschoben haben htg, Bash verwendet diese frühere Version des Programms.

Wenn wir jedoch die verwenden -a (alle) Option wie unten gezeigt, which Setzen Sie die Suche fort, auch wenn eine Übereinstimmung gefunden wird:

which -a htg

Anschließend werden alle Übereinstimmungen in einem der Verzeichnisse im Pfad aufgelistet.

Das ist also das Problem – es gibt eine ältere Version des Programms in einem Verzeichnis, das sich ebenfalls im Patch befindet. Und dieses Verzeichnis wird vor dem Verzeichnis durchsucht, in dem wir die neue Version des Programms hinterlegt 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.

In der Tat haben wir Optionen. Wir können entweder die alte Version in der löschen /use/local/bin Verzeichnis oder verschieben Sie es aus /usr/bin beim /usr/local/bin.

Schauen Sie sich diese Ergebnisse an

Zwei Ergebnisse bedeuten nicht unbedingt zwei Binärdateien.

Schauen wir uns ein Beispiel an, in dem wir das verwenden werden which bestellen mit dem -a (alle) und finden Sie die Versionen von less Programm:

which -a less

which meldet zwei Speicherorte, an denen eine Version von gehostet wird less Programm, aber ist es wahr? Es wäre seltsam, zwei verschiedene Versionen (oder dieselbe Version an mehreren Stellen) von zu haben less auf einem Linux-Computer installiert. Daher werden wir die Veröffentlichung von nicht akzeptieren which. Lassen Sie uns stattdessen etwas tiefer graben.

Wir können die verwenden ls, -l (lange Liste) und -h (menschlich lesbar) um zu sehen, was los ist:

ls -lh /usr/bin/less

Die Dateigröße beträgt neun Bytes! Es ist sicherlich keine vollständige Kopie von less.

Das erste Zeichen in der Liste ist ein „l“. Eine normale Datei hätte einen Bindestrich (-) als erstes Zeichen. Das „l“ ist ein Symbol, das bedeutet symbolischer Link. Wenn Sie dieses Detail verpasst haben, wird die --> Das Symbol zeigt auch an, dass es sich um a handelt symbolischer Link, die Sie sich als eine Art Abkürzung vorstellen können. Dies zeigt auf die Kopie von less im /bin.

Verwandt :  So überprüfen Sie, ob Websites in China blockiert sind

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

ls -lh /bin/less

Dieser Eintrag ist offensichtlich eine „echte“ binäre ausführbare Datei. Das erste Zeichen in der Liste ist ein Bindestrich (-), was bedeutet, dass dies eine normale Datei ist und die Dateigröße 167 KB beträgt. Eine einzelne Kopie von less installiert ist, aber es gibt einen symbolischen Link aus einem anderen Verzeichnis, den Bash auch bei der Suche nach dem Pfad findet.

Demnächst: Verwendung des Befehls ls zum Auflisten von Dateien und Verzeichnissen unter Linux

Mehrere Bestellungen gleichzeitig prüfen

Sie können mehrere Programme und Befehle an senden which, und es wird sie in der richtigen Reihenfolge überprüfen.

Wenn Sie beispielsweise Folgendes eingeben:

which ping cat uptime date head

which arbeitet die Liste der Programme und Befehle durch, die Sie bereitgestellt haben, und listet das Ergebnis für jedes von ihnen auf.

Welches was ist was?

Wenn Sie möchten, können Sie auch verwenden which auf sich selbst durch Eingabe der folgenden:

which which

Neben dem neugierigen Einstieg in das Linux-Dateisystem which Dies ist am nützlichsten, wenn Sie von einem Befehl oder Programm eine Reihe von Verhaltensweisen erwarten, aber eine andere erhalten.

Sie können verwenden which Stellen Sie in diesen Fällen sicher, dass der von Bash ausgeführte Befehl derjenige ist, den Sie verwenden möchten.