[LINUX] Was bedeutet es, den WEG zu durchlaufen? Wo sind die Befehle?

Überblick

Ich spiele mit Befehlen herum, aber wo sind die Befehle? Ich höre es oft durch den Pfad, aber was bedeutet das? Dieser Artikel wurde für Anfänger geschrieben, die darüber nachdachten. Ich lese den Code des Befehls nicht.

Übrigens wird jeder Befehl auf Mac und zsh ausprobiert, für Unix-Serien ist er jedoch ähnlich.

Fazit

Um früher abzuschließen, bedeutet das Durchlaufen des Pfads **, die Position des externen Befehls im Befehlssuchpfad zu registrieren, damit der externe Befehl ausgeführt werden kann, ohne ihn im Pfad anzugeben **. Details werden unten beschrieben.

Interne und externe Befehle

Die Befehle umfassen ** interne Befehle (integrierte Befehle) **, die in die Shell integriert sind, und ** externe Befehle **, die als Dateien in einem bestimmten Verzeichnis abgelegt werden, wie unten gezeigt.

パッケージ管理マネージャ.png

Wo ist der Befehl ls?

Versuchen wir die Position des Befehls ls mit dem Befehl which.

$ which ls

Ausgabe:

/bin/ls

Anscheinend ist es direkt unter "/ bin".

Was ist in / bin?

Nun schauen wir in / bin.

$ ls /bin

Ausgabe:

[		chmod		dash		df		expr		ksh		ln		mv		pwd		sh		sync		unlink
bash		cp		date		echo		hostname	launchctl	ls		pax		rm		sleep		tcsh		wait4path
cat		csh		dd		ed		kill		link		mkdir		ps		rmdir		stty		test		zsh

Sie haben eine Datei mit demselben Namen wie Ihr Lieblingsbefehl.

Der Inhalt des externen Befehls ist eine Datei

Wenn Sie sich den Inhalt des Befehls ls ansehen, sehen Sie, dass es sich um eine ** Binärdatei ** handelt.

$ od -h /bin/ls | more

Ausgabe:

0000000      facf    feed    0007    0100    0003    0000    0002    0000
0000020      0013    0000    0710    0000    0085    0020    0000    0000
0000040      0019    0000    0048    0000    5f5f    4150    4547    455a
0000060      4f52    0000    0000    0000    0000    0000    0000    0000
(Abkürzung)

So führen Sie einen externen Befehl aus

Interne Befehle werden beim Starten des Computers in den Speicher geladen, aber ** externe Befehle existieren als Dateien auf der Festplatte (z. B. unter / bin) und werden jedes Mal von der Festplatte geladen **.

Dies bedeutet, dass Sie beim Ausführen eines externen Befehls ** den direkten Pfad zum Ausführen des externen Befehls ** angeben können.

** Beispiel: Führen Sie den Befehl ls direkt aus, um den Speicherort der Datei anzugeben. **


$ /bin/ls

Sie können den Befehl wie oben beschrieben ausführen, er ist jedoch problematisch, sodass eine Umgebungsvariable namens "PATH" vorhanden ist. Dies wird streng als ** Befehlssuchpfad (Befehlssuchpfad) ** bezeichnet.

Auch wenn Sie den Pfad nicht direkt angeben, durchsucht das Programm den Befehlssuchpfad ohne Berechtigung, sodass Sie den Befehl ls wie unten gezeigt ausführen können.


$ ls

Der Inhalt von PATH ist eine Gruppe von Verzeichnissen mit externen Befehlen.

Um den Inhalt von "PATH" einmal anzuzeigen, verwenden Sie den Befehl "echo", um "PATH" anzuzeigen.


$ echo $PATH

Ausgabe:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

Bei Betrachtung der Ergebnisse wurden einige Verzeichnisse getrennt durch : ausgegeben.

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Library/Apple/usr/bin

Diese geben den Ort (Pfad) des externen Befehls an.

Wenn der Pfad nicht bestanden wird

Wenn Sie versuchen, einen Befehl auszuführen, der "PATH" nicht übergibt oder nicht existiert, erhalten Sie Folgendes.

** Beispiel: für zsh **

zsh: command not found: hogehoge

Wenn Sie den Befehl bereits hätten eingeben sollen, aber "nicht gefunden" usw. angezeigt wird. Oft geht der "Pfad" nicht vorbei.

Den WEG bestehen

Um "PATH" zu übergeben, müssen Sie den Pfad des Verzeichnisses, in dem der gewünschte Befehl abgelegt ist, zur ** Umgebungsvariablen "PATH" hinzufügen. ** ** **

Zum Beispiel, wenn Sie den Befehl php unter / hogehoge / bin verwenden möchten Fügen Sie / hogehoge / bin zur Umgebungsvariablen PATH hinzu.

Versuchen Sie es mit dem Befehl export hinzuzufügen.

$ export PATH="/hogehoge/bin:$PATH"

Überprüfen Sie, ob es mit "echo" hinzugefügt wurde. (Sie können auch den hinzugefügten Befehl ausprobieren.)

$ echo $PATH

Ausgabe:

/hogehoge/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

Wie oben erwähnt, können Sie Umgebungsvariablen mit dem Befehl "export" hinzufügen. Es ist jedoch mühsam, jedes Mal mit dem Befehl "export" hinzuzufügen, also grundsätzlich ** in der Konfigurationsdatei der von Ihnen verwendeten Shell. Anhängen. ** ** **

Dies überschreibt automatisch "PATH", wenn Sie die Shell starten.

** Beispiel: für zsh **

Fügen Sie mit export in die .zshrc-Datei im HOME-Verzeichnis ein.

.zshrc


export PATH="/hogehoge/bin:$PATH"

Am Ende habe ich "$ PATH" geschrieben, wodurch die vorhandene Umgebungsvariable "PATH" erweitert wird. Mit anderen Worten, es hat die gleiche Bedeutung wie:

.zshrc


export PATH="/hogehoge/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"

Wenn Sie zu diesem Zeitpunkt den vorhandenen vollständig überschreiben, ** können verschiedene Befehle nicht verwendet werden. Seien Sie also vorsichtig. ** ** ** Wenn Sie beispielsweise Folgendes tun, werden Befehle wie unter ** / bin nicht gelesen. ** ** **

.zshrc


export PATH="/hogehoge/bin"

Wie oben beschrieben, ermöglicht die Umgebungsvariable "PATH" die Ausführung eines vorgegebenen externen Befehls, ohne den Pfad direkt anzugeben. Wenn Sie nichts über die Shell-Einstellungsdatei wissen, können Sie die verwendete Shell überprüfen und googeln, wie sie geschrieben wird.

PFAD Priorität

"PATH" hat Priorität. In den folgenden Fällen wird es beispielsweise in der Reihenfolge von "/ hogehoge / bin" auf der linken Seite gelesen.

PATH=/hogehoge/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

Zum Beispiel, wenn es Befehle php in / hogehoge / bin und / use / local / bin gibt,

$ php

Wenn Sie ausführen, ist dies der Befehl "php" von "/ hogehoge / bin".

Wie Sie sehen können, müssen Sie bei der Angabe von "PATH" auch auf die Priorität achten.

Unterschiede in der Position jedes Befehls (/ bin, / usr / local / bin usw.)

Die Position externer Befehle wird von FHS (Filesystem Hierarchy Standard) in Form von ** "Lassen Sie uns diese Befehle an dieser Position platzieren!" ** standardisiert. Unabhängig davon, mit welchem Linux-System Sie spielen, wird auf einen Blick klar, dass "dieses / bin-Verzeichnis Kernbefehle enthält, die auch im Notfall verwendet werden können". (Obwohl es standardisiert ist, wird es nicht erzwungen, so dass seltsame Befehle für jedes Betriebssystem an seltsamen Orten sein können.)

In der folgenden Tabelle sind die Positionen der durch diese standardisierten externen Befehle und die Unterschiede zwischen ihnen zusammengefasst. Schauen wir uns jedoch die einzelnen Befehle an.

Verzeichnis Einzelbenutzermodus Zusammenfassung
/bin verfügbar Die, die auch im Notfall verwendet werden kann
/usr/bin außer Betrieb General
/usr/local/bin außer Betrieb Mein eigenes Skript
/sbin verfügbar Erfordert Superuser- (Root-) Berechtigungen
/usr/sbin außer Betrieb Erfordert Superuser- (Root-) Berechtigungen

/bin Platzieren Sie die ** wichtigsten externen Befehle **, die im Einzelbenutzermodus verwendet werden können, in diesem Verzeichnis. Der Einzelbenutzermodus wird im Notfall verwendet, z. B. wenn das Betriebssystem nicht normal gestartet werden kann.

Wie ich zu Beginn bestätigt habe, war der folgende Befehl im / bin meines Macbook Pro enthalten.

[		chmod		dash		df		expr		ksh		ln		mv		pwd		sh		sync		unlink
bash		cp		date		echo		hostname	launchctl	ls		pax		rm		sleep		tcsh		wait4path
cat		csh		dd		ed		kill		link		mkdir		ps		rmdir		stty		test		zsh

Wenn Sie diese Befehle nicht kennen, können Sie sie nachschlagen und feststellen, dass sie alle einfach und wichtig sind.

/usr/bin Anstatt es im Einzelbenutzermodus zu verwenden, setzen Sie im Grunde die vom Paketmanager (Paketverwaltungssystem) verwalteten Befehle. Es gibt verschiedene Paketmanager für jedes Betriebssystem, aber ich werde sie hier nicht erwähnen. Überprüfen Sie im Verzeichnis auf Ihrem Computer, welche Befehle tatsächlich verfügbar sind.

/usr/local/bin Fügen Sie nicht verwaltete Befehle in den Paket-Manager ein, die im Einzelbenutzermodus nicht verwendet werden.

Übrigens, Homebrew, ein Paketmanager, der Mac-Benutzern vertraut ist, Verwenden Sie dieses Verzeichnis. Auf der Homebrew-Seite erfahren Sie, warum Homebrew diesen Speicherort verwendet.

https://docs.brew.sh/FAQ#why-does-homebrew-prefer-i-install-to-usrlocal

Übersetzt heißt es:

Apple hat dieses Verzeichnis für Nicht-Systemdienstprogramme zugewiesen. Dies bedeutet, dass sich standardmäßig keine Dateien in / usr / local befinden, sodass Sie sich keine Sorgen machen müssen, Ihre vorhandenen oder Systemtools zu ruinieren.

/ sbin und / usr / sbin

Es wird grundsätzlich genauso behandelt wie das Verzeichnis jeder obigen Hierarchie, aber im Gegensatz zu "bin" werden Verwaltungsbefehle abgelegt, mit denen der Systemadministrator herumspielen kann. Diese stehen regulären Benutzern nicht zur Verfügung, da sie Superuser- (Root-) Berechtigungen erfordern.

Zusammenfassung

Wie ich zuvor geschrieben habe, ist die Schlussfolgerung

Durch PATH zu gelangen bedeutet, die Position eines externen Befehls im Befehlssuchpfad zu registrieren, damit der externe Befehl ausgeführt werden kann, ohne ihn im Pfad anzugeben.

Es war das.

Ich habe nicht viele Artikel gefunden, in denen interne und externe Befehle beim Durchlaufen des Pfads erwähnt wurden, also habe ich diesmal geschrieben.

Recommended Posts

Was bedeutet es, den WEG zu durchlaufen? Wo sind die Befehle?
Python Hinweis: Was bedeutet es, einen Startwert mit Zufallszahlengenerierung zu setzen?
Was bedeutet das letzte () in einer Funktion in Python?
Ich habe es in der Sprache Go geschrieben, um das SOLID-Prinzip zu verstehen
Was tun, wenn der Benutzername geändert wird und der Pfad der pyenv-Bibliothek nicht übergeben wird?
Was tun, wenn die Einstellungen der jupyterlab-Erweiterung nicht angezeigt werden?
Wenn Sie versuchen, das mit pip installierte Jupyter-Notebook zu starten und "Befehl nicht gefunden" angezeigt wird, können Sie den PATH anscheinend durchgehen.