Kern der Frage:
Die Frage stellte sich, als ich die Software nicht installieren konnte, und ich frage wirklich nach ./, weil ich nichts davon wusste und die Ausgabe "Befehl nicht gefunden" mich verwirrte, was der Befehl eigentlich war.
Kontext:
Ich möchte die Datei installieren truecrypt-7.2-setup-x86
.
Anweisungen sagen, um den Befehl zu verwenden:
sudo ./truecrypt-7.2-setup-x86
Aber die Ausgabe ist:
sudo: ./truecrypt-7.2-setup-x86: command not found
UPDATE: Der Vollständigkeit halber befand ich mich im Test im Dateiordner, hatte aber die Datei noch nicht ausführbar gemacht (chmod + x).
./
Teil des Befehls lautet: "Sehen Sie sich das aktuelle Verzeichnis an und führen Sie von hier aus den Befehl 'truecrypt-7.2-setup-x86' aus." Sie müssen diesen Befehl in dem Verzeichnis ausführen, in das Sie die Datei entpackt haben.chmod +x
, daschmod -x
ist das Gegenteil - es entfernt ausführbare BerechtigungenAntworten:
./
ist kein Befehl. Der Befehl lautet./truecrypt-7.2-setup-x86
.Ihre Shell und Programme wie
sudo
behandeln einen Befehl als Pfadnamen, wenn er mindestens ein/
Zeichen enthält. Da es sich.
um das Verzeichnis handelt, in dem Sie sich gerade befinden, wird./truecrypt-7.2-setup-x86
die Dateitruecrypt-7.2-setup-x86
im aktuellen Verzeichnis benannt. Wenn keine solche Datei vorhanden ist oder die Datei nicht ausgeführt werden kann, wird eine Fehlermeldung angezeigt.Wenn ein Befehl keinen Schrägstrich enthält, werden die darin aufgeführten Verzeichnisse danach
$PATH
durchsucht, wie Sergiy Kolodyazhnyy sagt . Das aktuelle Verzeichnis ist gesucht nicht automatisch - und es wird nicht zu setzen empfohlen.
in$PATH
. Auf diese Weise führen Sie nicht versehentlich Dinge aus, von denen Sie nicht erwartet hatten, dass sie ausgeführt werden, weil Sie zufälligcd
d in einem Verzeichnis haben, das sie enthält.Schreiben Sie
./
vor dem Namen einer ausführbaren Datei im aktuellen Verzeichnis die übliche Methode , um sie auszuführen, dies ist jedoch keine spezielle Syntax. Wenn Sie zum Beispiel Ihren Code durcheinander gebracht haben$PATH
und einen Befehl wie diesen ausführen müssenls
, können Sie schreiben/bin/ls
. Nein.
ist in diesem Fall oder im Allgemeinen notwendig; Was benötigt wird, ist ein/
Punkt im Pfadnamen, der anzeigt, dass es sich um einen Pfadnamen handelt.Da
.
es sich immer um das aktuelle Verzeichnis und/
nur um das Verzeichnistrennzeichen handelt, müssen Sie zunächst überprüfen, ob die von Ihnen angegebene Datei tatsächlich im aktuellen Verzeichnis vorhanden ist. (Wenn dies der Fall ist, überprüfen Sie die Berechtigungen , wie Charles Green erläutert . Wenn Sie die Datei jedoch aus einem Archiv extrahiert haben, verfügt sie normalerweise bereits über ausführbare Berechtigungen, wenn sie ausgeführt werden soll.)quelle
Der Teil ./ des Befehls lautet: "Sehen Sie sich das aktuelle Verzeichnis an und führen Sie von hier aus den Befehl 'truecrypt-7.2-setup-x86' aus." Sie müssen diesen Befehl in dem Verzeichnis ausführen, in das Sie die Datei entpackt haben.
Dies kann getestet werden: Geben Sie in demselben Terminalfenster, in dem Sie den Befehl ausführen, den Befehl ein.
ls -l true*
Befindet sich die Datei im aktuellen Arbeitsverzeichnis, wird eine Liste mit der Datei (und einer Reihe zusätzlicher Informationen) angezeigt.Wie Zanna in den Kommentaren angemerkt hat, verfügt Ihre Datei möglicherweise nicht über Ausführungsberechtigungen - dies kann leicht behoben werden. Als Testfall zeigt mein Telefonbuch
und die Datei "rFullBack" listet "-rw-" als meine Erlaubnis auf, die Datei zu lesen und zu schreiben. Ich kann den Befehl ausführen
chmod +x rFullBack
und die Verzeichnisliste wechselt zuDort sind meine Berechtigungen jetzt '-rwx', was anzeigt, dass ich die Datei ausführen kann.
Kurz gesagt, wenn die Datei in Ihrem Verzeichnis vorhanden ist
Führen Sie den Befehl aus
und dann den Befehl
quelle
rw-
als Ihre Erlaubnis aufgeführt --
davor steht es für Set [gu] id und Sticky Bits.Wie funktioniert das Aufrufen von Befehlen in der Shell?
Nein, es ist kein Befehl. Die Art und Weise, wie Shells funktionieren, ist, wenn Sie eine Textzeile eingeben, das erste Wort als Befehl behandelt wird und wenn der Befehl keiner der in der Shell integrierten Befehle ist, werden alle in der
PATH
Umgebungsvariablen aufgelisteten Speicherorte angezeigt .Was passiert, wenn sich der Befehl, den Sie ausführen möchten, in demselben Verzeichnis befindet, in dem Sie sich gerade befinden, dieses Verzeichnis jedoch nicht in der Liste der
PATH
Verzeichnisse aufgeführt ist? Das ist, wenn Sie verwenden müssen./
. Es ist in gewisser Weise genau das Gleiche wie dies der Fall ist/bin/bash
- Sie teilen der Shell mit, wo sich Ihr gewünschter Befehl befindet, und geben einen vollständigen Pfad dazu an. Und im Falle von ./ sagst du zu Shell "Schau in dieses Verzeichnis". Ein so wichtiger Teil ist, dass Sie sich in demselben Verzeichnis befinden müssen, in dem sich die Datei befindet.Natürlich muss das ausführbare Bit gesetzt sein, damit eine ausführbare Datei ausgeführt werden kann
chmod +x ./my_file
.Also die wichtigen Schritte:
cd
wo Sie die Datei gespeichert haben; wenn es drin ist~/Downloads
, danncd ~/Downloads
chmod +x ./truecrypt-7.2-setup-x86
"make file truecrypt-7.2-setup-x86" aus, das sich in diesem Verzeichnis befindet.sudo ./truecrypt-7.2-setup-x86
Beachten Sie, dass die Verwendung von
./
kein zufälliges Verhalten ist, sondern ein Standard, der durch den Portable Operating System Interface-Standard (auch bekannt als POSIX) spezifiziert ist. Weitere Informationen finden Sie im Abschnitt "Befehlssuche und -ausführung".Reproduzieren des Fehlers
HINWEIS : Die Fehlermeldung von
sudo
ist offensichtlich irreführend. Bitte beachten Sie jedoch, dass dies nicht der Kern der Frage war, die OP stellt.Dokumentation und Referenzen
Ab
bash
Handbuch 4.3, Abschnitt "BEFEHLSAUSFÜHRUNG":Von Warum müssen Sie ./ (Punkt-Schrägstrich) vor Skriptnamen es in bash laufen? :
quelle
sudo
Ausgabe irreführend. Wenn Sie das gleiche versuchen , ohnesudo
, werden Sie eine andere Fehlermeldung erhalten vonbash
:Permission denied
. Und das zu Recht, da Sie nicht die Berechtigung zum Ausführen des Skripts (überchmod +x
) erteilt haben .sudo
Ausgabe irreführend ist, ist wahr, aber das ist der Fehler, der auftaucht. Möglicherweise müssen Sie dies den Entwicklern melden und sie das Problem beheben lassen. Dies ist jedoch nicht der Kern der Diskussion - wir mussten feststellen, was das OP getan hat, um einen solchen Fehler hervorzurufen, und sie auf den richtigen Weg führen. Ob es irreführend ist oder nicht - darauf kommt es hier nicht an./bin/bash
: Es ermöglicht es Ihnen nicht um ein Skript auszuführen , auf das Sie haben keine Berechtigung ausführen. Wenn Sie den Skriptnamen mit einem Vorwort versehen/bin/bash
,/bin/bash
ist nur die ausführbare Datei von Bedeutung, da es sich um den ausgeführten Befehl handelt. Wenn Sie das nicht tun, wird das Skript selbst ausgeführt, was wiederum dazu führt, dass entweder Ihre aktuelle Shell oder das, was sich in der obersten#!
Zeile befindet, aufgerufen wird/bin/bash
ist hier nur ein Beispiel. Die Tatsache , dass wir fordern/bin/bash
und./script.sh
durch Angabe des Pfades zu Sache ausgeführt wird - das ist das gleiche. Voranstellen von Skripten mitbash script.sh
oder/bin/bash script.sh
ist ein völlig anderes Thema, bei dem Sie eine ausführbare Datei ausführen und Skripten als Argument übergeben - was übrigens zu Problemen führen kann, wenn die Syntax nicht für die von Ihnen aufgerufene Shell geschrieben wirdcsh
./bin/bash
ist in Ordnung ausführbar, aber Tatsache ist, dass Sie immer noch den vollständigen Pfad dazu angeben./bin/bash
oder nur mitbash
ist auch eine übliche Methode, um den Mangel an ausführbaren Berechtigungen für das Skript zu beheben . Den vollständigen Skript Pfad angeben wird nicht löst dieses Problem. So/bin/bash
ist ein besonders schlechtes Beispiel in diesem speziellen Fall.