Der Linux-Befehl 'which': Befehle lokalisieren

LinuxBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie den Befehl which verwenden, um die ausführbare Datei zu finden, die eine Shell für einen bestimmten Befehlsnamen ausführt. Sie werden installierte Befehle überprüfen, mit nicht verfügbaren Befehlen umgehen, mehrere Treffer auflisten und sehen, wie sich die PATH-Variable auf das Ergebnis auswirkt.

Um das Verhalten von which besser verständlich zu machen, verwendet dieses Lab zudem einige unterstützende Shell-Konzepte wie einfache Skripte, Ausführungsberechtigungen und temporäre Änderungen des PATH. Jedes neue Konzept wird direkt im Kontext erklärt, damit Sie sich darauf konzentrieren können, warum which einen bestimmten Pfad zurückgibt.

Die Grundlagen von 'which' verstehen

Während Sie sich in Ihrer neuen Rolle bei TechCorp einarbeiten, bittet Sie Ihr Teamleiter, die Installation einiger wichtiger Entwicklungstools zu überprüfen. Der Befehl which wird für diese Aufgabe Ihr bevorzugtes Werkzeug sein.

Der Befehl which wird verwendet, um die ausführbare Datei zu lokalisieren, die mit einem bestimmten Befehl verknüpft ist, indem die in der Umgebungsvariablen PATH aufgelisteten Verzeichnisse durchsucht werden.

Beginnen wir mit der Suche nach dem gcc-Compiler:

which gcc

Sie sollten eine Ausgabe ähnlich dieser sehen:

/usr/bin/gcc

Diese Ausgabe zeigt Ihnen, dass sich die ausführbare Datei gcc im Verzeichnis /usr/bin befindet. Das bedeutet, wenn Sie gcc im Terminal eingeben, führt das System die Datei unter /usr/bin/gcc aus.

Versuchen wir nun, ein weiteres wichtiges Tool zu finden, python:

which python

Möglicherweise sehen Sie etwas wie:

/usr/local/bin/python

Der Befehl which durchsucht die in Ihrer PATH-Umgebungsvariablen aufgeführten Verzeichnisse und gibt den ersten Treffer zurück, den er findet. Wenn Sie einen anderen Pfad sehen, machen Sie sich keine Sorgen – das bedeutet lediglich, dass Python an einem anderen Ort auf Ihrem System installiert ist.

Umgang mit nicht vorhandenen Befehlen

Ihr Teamleiter erwähnt, dass TechCorp früher ein benutzerdefiniertes Build-Tool namens techbuild verwendet hat. Prüfen wir, ob es noch installiert ist:

which techbuild

Möglicherweise sehen Sie keine Ausgabe (Bash-Shell) oder eine Fehlermeldung wie techbuild not found (Zsh-Shell).

Dies liegt daran, dass which nichts zurückgibt, wenn es den Befehl nicht in Ihrem PATH finden kann. Lassen Sie sich von der fehlenden Ausgabe nicht beunruhigen – es ist die Art des Befehls, Ihnen mitzuteilen, dass techbuild in keinem der Verzeichnisse Ihres PATH gefunden wurde.

Um dieses Verhalten expliziter zu machen, können wir ein einfaches Shell-Skript verwenden. Wir führen hier zwei neue Konzepte ein:

  1. Ein Shell-Skript ist eine Textdatei, die Befehle speichert und diese nacheinander ausführt.
  2. Das Muster cat <<'EOF' ... EOF schreibt mehrere Zeilen in eine Datei, ohne dass Sie sich um verschachtelte Anführungszeichen kümmern müssen.

Erstellen wir ein Skript, um nach techbuild zu suchen:

cat > ~/check_techbuild.sh <<'EOF'
#!/bin/bash
if which techbuild >/dev/null 2>&1; then
  echo "techbuild is installed"
else
  echo "techbuild is not installed"
fi
EOF

Dieser Befehl erstellt eine Datei namens ~/check_techbuild.sh und füllt sie mit einem kleinen Bash-Skript.

Hier ist die Bedeutung der wichtigen Zeilen:

  • #!/bin/bash weist Linux an, das Skript mit Bash auszuführen.
  • which techbuild prüft, ob der Befehl in Ihrem PATH gefunden werden kann.
  • >/dev/null 2>&1 unterdrückt die normale Ausgabe und Fehlermeldungen, damit das Skript sein eigenes, klares Ergebnis ausgeben kann.

Geben Sie der Datei nun die Ausführungsberechtigung und führen Sie sie aus:

chmod +x ~/check_techbuild.sh

Der Befehl chmod +x fügt die Ausführungsberechtigung hinzu, wodurch Linux die Datei als Befehl ausführen kann.

~/check_techbuild.sh

Dieses Skript gibt techbuild is not installed aus, da which diesen Befehl nicht finden konnte.

Mehrere Installationen entdecken

Während Sie Ihre Umgebung weiter einrichten, stellen Sie fest, dass TechCorp für verschiedene Projekte mehrere Python-Versionen verwendet. Die Option -a von which kann Ihnen helfen, alle Installationen eines Befehls zu entdecken:

which -a python

Sie sehen möglicherweise eine Ausgabe wie diese:

/usr/local/bin/python
/usr/bin/python
/bin/bin/python

Diese Ausgabe zeigt an, dass mehrere Python-Installationen auf dem System vorhanden sind. Die Option -a weist which an, alle passenden ausführbaren Dateien im PATH auszugeben, nicht nur die erste.

Dies zu verstehen ist entscheidend, da es Ihnen alle möglichen Python-Dateien zeigt, die je nach Ihrer PATH-Konfiguration ausgeführt werden könnten. Die erste aufgelistete Datei ist diejenige, die ausgeführt wird, wenn Sie python im Terminal eingeben.

PATH-Priorität verstehen

Ihr Teamleiter erklärt, dass die Reihenfolge der Verzeichnisse in der PATH-Variablen bestimmt, welche Version eines Befehls standardmäßig verwendet wird. Überprüfen wir Ihren PATH:

echo $PATH

Sie sehen eine durch Doppelpunkte getrennte Liste von Verzeichnissen. Zum Beispiel:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Die Reihenfolge ist wichtig: Verzeichnisse, die weiter vorne stehen, haben eine höhere Priorität. Das bedeutet, wenn es zwei ausführbare Dateien mit demselben Namen in verschiedenen Verzeichnissen gibt, wird diejenige in dem Verzeichnis verwendet, das im PATH zuerst erscheint.

Das Lab-Setup hat bereits einen benutzerdefinierten prioritydemo-Befehl in ~/custom_bin erstellt. Fügen Sie dieses Verzeichnis an den Anfang Ihres PATH an, damit es vor den Systemverzeichnissen durchsucht wird:

export PATH=$HOME/custom_bin:$PATH

Prüfen Sie nun, welcher prioritydemo-Befehl standardmäßig ausgeführt wird:

which prioritydemo

Sie sollten eine Ausgabe ähnlich dieser sehen:

/home/labex/custom_bin/prioritydemo

Um jeden passenden prioritydemo-Befehl in Ihrem PATH zu sehen, führen Sie aus:

which -a prioritydemo

Sie sollten zuerst Ihren benutzerdefinierten Befehl sehen, gefolgt von der Kopie, die bereits in /usr/local/bin verfügbar ist:

/home/labex/custom_bin/prioritydemo
/usr/local/bin/prioritydemo

Dies demonstriert die PATH-Priorität deutlich: which prioritydemo gibt die erste passende ausführbare Datei zurück, während which -a prioritydemo jede passende ausführbare Datei in der aktuellen Suchreihenfolge anzeigt.

Einen benutzerdefinierten Befehl erstellen

Ihr Teamleiter schlägt vor, einen einfachen benutzerdefinierten Befehl zu erstellen, um zu demonstrieren, wie which mit dem PATH interagiert. Erstellen wir ein Skript namens hello in Ihrem Home-Verzeichnis:

cat > ~/hello <<'EOF'
#!/bin/bash
echo "Hello from TechCorp!"
EOF
chmod +x ~/hello

Dies erstellt eine neue Datei namens hello in Ihrem Home-Verzeichnis und macht sie ausführbar. Das Skript gibt Hello from TechCorp! aus, wenn es ausgeführt wird.

Versuchen Sie nun, es auszuführen:

hello

Sie erhalten einen Fehler vom Typ "command not found", da Ihr Home-Verzeichnis nicht im PATH enthalten ist. Der PATH ist eine Liste von Verzeichnissen, in denen die Shell nach ausführbaren Dateien sucht.

Fügen wir Ihr Home-Verzeichnis temporär zum PATH hinzu:

export PATH="$PATH:$HOME"

Dieser Befehl fügt Ihr Home-Verzeichnis für die aktuelle Terminalsitzung am Ende des PATH hinzu. Der export-Befehl macht den aktualisierten PATH für Befehle verfügbar, die Sie danach ausführen.

Jetzt können Sie hello ausführen, und which wird es finden:

hello
which hello

Sie sollten "Hello from TechCorp!" und den Pfad zu Ihrem Skript sehen. Dies zeigt, wie which ausführbare Dateien in jedem Verzeichnis findet, das in Ihrem PATH aufgeführt ist.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den Befehl which verwenden, um ausführbare Dateien im PATH Ihres Systems zu lokalisieren. Sie haben gelernt, wie man:

  1. Den Speicherort installierter Programme findet
  2. Mit nicht vorhandenen Befehlen umgeht
  3. Mehrere Installationen desselben Befehls entdeckt
  4. Die PATH-Priorität versteht
  5. Eigene Befehle erstellt und lokalisiert

Sie haben außerdem geübt, einfache Shell-Skripte zu schreiben, Dateien mit chmod +x ausführbar zu machen und den PATH anzupassen, um zu steuern, welcher Befehl ausgeführt wird.

Diese Fähigkeiten werden von unschätzbarem Wert sein, während Sie Ihre Reise als Entwickler bei TechCorp und darüber hinaus fortsetzen.