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
- Führen Sie
chmod +x ./truecrypt-7.2-setup-x86
"make file truecrypt-7.2-setup-x86" aus, das sich in diesem Verzeichnis befindet.
- Und jetzt tu es
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
$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
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":
Wenn der Name weder eine Shell-Funktion noch eine integrierte Funktion ist und keine Schrägstriche enthält, durchsucht bash jedes Element des PATH nach einem Verzeichnis, das eine ausführbare Datei mit diesem Namen enthält.
Von Warum müssen Sie ./ (Punkt-Schrägstrich) vor Skriptnamen es in bash laufen? :
Es funktioniert mit ./, da POSIX angibt, dass ein Befehlsname, der ein / enthält, direkt als Dateiname verwendet wird, wodurch eine Suche in $ PATH unterdrückt wird. Sie hätten den vollständigen Pfad für genau den gleichen Effekt verwenden können, aber ./ ist kürzer und einfacher zu schreiben.
./
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.