a.out
Warum muss ich beim Ausführen eines C-Programms mit dem Ubuntu-Terminal immer ./
vorher tippen a.out
, anstatt nur zu schreiben a.out
? Gibt es dafür eine Lösung?
a.out
Warum muss ich beim Ausführen eines C-Programms mit dem Ubuntu-Terminal immer ./
vorher tippen a.out
, anstatt nur zu schreiben a.out
? Gibt es dafür eine Lösung?
Antworten:
Wenn Sie den Namen eines Programms wie Typ - a.out
System sucht nach der Datei in Ihrer PATH. In meinem System ist PATH auf eingestellt
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Ihre ist wahrscheinlich ähnlich. Zum Überprüfen geben Sie echo $PATH
ein Terminal ein.
Das System durchsucht diese Verzeichnisse in der angegebenen Reihenfolge und wenn es das Programm nicht findet, wird ein command not found
Fehler ausgegeben .
Wenn Sie dem Befehl ./
effektiv den Zusatz "Vergiss den Pfad, ich möchte, dass du nur in das aktuelle Verzeichnis schaust" voranstellen .
Auf ähnliche Weise können Sie das System anweisen, nur an einer anderen bestimmten Stelle zu suchen, indem Sie dem Befehl einen relativen oder absoluten Pfad voranstellen, z.
../
bedeutet im übergeordneten Verzeichnis zB ../hello
Hallo im übergeordneten Verzeichnis suchen.
./Debug/hello
: "suche hello
im Debug - Unterverzeichnis meines aktuellen Verzeichnisses."
oder /bin/ls
: " ls
im Verzeichnis suchen /bin
"
Standardmäßig befindet sich das aktuelle Verzeichnis nicht im Pfad, da dies als Sicherheitsrisiko angesehen wird. Siehe Warum ist. Nicht im Pfad standardmäßig? auf Superuser für warum.
Es ist möglich, das aktuelle Verzeichnis zu Ihrem PFAD hinzuzufügen, aber aus den in der verknüpften Frage angegebenen Gründen würde ich es nicht empfehlen.
.
zu Ihren PATH
(wie in den anderen 2 Antworten vorgeschlagen) hinzufügen .
.
hier, Sie einen vollständigen oder relativen Pfad zu einer ausführbaren zB verwenden können , /home/user/foo/a.out
oder./build/a.out
.
ist es etwas Besonderes, denn es bedeutet "Mein aktuelles Verzeichnis" und kann jedes Verzeichnis sein, in dem sich der Benutzer mit Lese- und Ausführungsrechten befindet. Dies ist möglicherweise gefährlicher als das Hinzufügen eines bestimmten vollständig qualifizierten Pfads.
.
hält keinen besonderen Status, es ist nur ein Weg, der mit genauso gut beginnen könnte /
und ./blah
würde genauso gut mit arbeiten cat
oder grep
als Bash - Eingabeaufforderung.
Der Grund dafür ist einfach.
Angenommen, Sie haben einen Befehl mit demselben Namen wie eine Anwendung im aktuellen Verzeichnis. Wenn Sie den Befehl dann in der Shell ausführen, wird Ihre App anstelle des integrierten Befehls aufgerufen. Dies wäre ein Sicherheitsrisiko, wenn nichts anderes.
Da ./
die Shell vorausgesetzt wird, dass sie im Vordergrund verwendet wird, weiß sie, dass Sie die Anwendung mit dem angegebenen Namen ausführen möchten und nicht mit einem integrierten Befehl mit diesem Namen.
./
führt Dateien aus, die sich nicht in Ihrem befinden $PATH
, sondern führt die Datei im aktuellen Verzeichnis (oder einem anderen Via ./home/stefano/script.sh
) aus. Jetzt ist PATH eine Umgebungsvariable, die alle Stellen enthält, an denen bash nach ausführbaren Programmen suchen kann, ohne den vollständigen (absoluten) Pfad zu ihnen zu haben.
Diese Trennung ist erforderlich, um zu vermeiden, dass die falsche Datei ausgeführt wird. Wenn Sie also eine Datei ls
in Ihrem Home-Verzeichnis haben, die nicht in Ihrem PATH enthalten ist, kann bash sie nicht mit der echten verwechseln ls
. Die Variable PATH definiert auch die Suchreihenfolge:
exec
Systemaufruf durchzuführen (eine spezielle Methode des Kernels, wie Programme gestartet werden), sucht das System nach der Datei, indem es alle Verzeichnisse in Ihrem PATH durchsucht. Sobald das Programm gefunden wurde, wird die Suche unterbrochen, auch wenn es sich in mehreren Verzeichnissen befindet, und das erste gefundene Programm wird ausgeführt.Um eine Datei auszuführen, müssen Sie das ausführbare Bit in den Berechtigungen festlegen:
Da Sie bereits in der Befehlszeile sind, können Sie einfach eingeben chmod +x finename
.
Sie können die Berechtigungen auch festlegen, indem Sie mit der rechten Maustaste auf die Datei klicken und Eigenschaften auswählen :
Sie können die Datei jetzt in eines der Verzeichnisse in PATH kopieren, um zu sehen, welche Verzeichnisse sich dort befinden - und welche benutzerspezifisch festgelegt sind - echo $PATH
.
stefano@3000-G530:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Wenn Sie eine ausführbare Datei erstellen cat
und in diese verschieben, /usr/local/sbin
wird diese anstelle der eigentlichen Datei ausgeführt, in der sich die Datei cat
befindet /bin
. Sie können herausfinden, wo Ihre Dateien sind durch die Verwendung type cat
und whereis cat
.
gcc
, wodurch das Ausführungsbit automatisch gesetzt wird.
./
vor dem Ausführen eines Programms etwas eingeben?Wenn Sie im Terminal den Namen einer Anwendung eingeben, durchsucht gedit
das Terminal beispielsweise einige (vordefinierte) Verzeichnisse, die Anwendungen enthalten (die Binärdateien der Anwendungen). Die Namen dieser Verzeichnisse sind in einer Variablen namens enthalten PATH
. Sie können sehen, was in dieser Variablen enthalten ist, indem Sie ausführen echo $PATH
. Sehen Sie diese Verzeichnisse getrennt durch :
? Das sind die Verzeichnisse , die das Terminal gehen sucht in, wenn Sie nur geben gedit
, nautilus
oder a.out
. Wie Sie sehen, ist der Pfad Ihres a.out
Programms nicht vorhanden. Wenn Sie dies tun ./a.out
, teilen Sie dem Terminal mit, dass Sie in das aktuelle Verzeichnis schauen und ausführen a.out
und nicht hineingehen PATH
.
Wenn Sie nicht ./
jedes Mal etwas eingeben möchten , müssen Sie das a.out
Verzeichnis hinzufügen $PATH
. In den folgenden Anweisungen gehe ich davon aus, dass der Pfad zu a.out
lautet /path/to/programs/
, Sie sollten ihn jedoch in Ihren tatsächlichen Pfad ändern.
Fügen Sie einfach die folgende Zeile am Ende der Datei hinzu ~/.pam_environment
:
PATH DEFAULT=${PATH}:/path/to/programs
Quelle: Persistente Umgebungsvariablen
Melden Sie sich ab und wieder an. Sie können jetzt a.out
ohne ./
Verzeichnis ausgeführt werden.
Wenn Sie andere Programme in anderen Verzeichnissen haben, können Sie diese einfach in die obige Zeile einfügen. Ich würde jedoch empfehlen, ein Verzeichnis mit dem Namen "myPrograms" zu haben und alle Ihre Programme darunter abzulegen.
Hinweis: Wechseln Sie
userName
zu Ihrem tatsächlichen Ubuntu-Benutzernamen.
Was ist, wenn Sie andere Programme haben, die Sie ausführen möchten? Und sie sind alle in verschiedenen Ordnern? Nun, eine "besser organisierte" Lösung wäre, einen Ordner bin
unter Ihrem Home-Verzeichnis zu erstellen und symbolische Links (Verknüpfungen) unter diesem Ordner hinzuzufügen. Hier ist wie:
mkdir /home/userName/bin
bin
unter Ihrem Home-Verzeichnis erstellt.ln -s /path/to/programs/a.out /home/userName/bin
a.out
Programms unter erstellen bin
.Melden Sie sich ab und wieder an. Sie können jetzt a.out
ohne ./
Verzeichnis ausgeführt werden.
Wenn Sie jetzt irgendwo anders ein anderes Programm haben, sagen wir, das Programm b.in
auf Ihrem Desktop, müssen Sie nur noch Folgendes tun ln -s /home/userName/Desktop/b.in /home/userName/bin
:, und Sie können es dann auch ohne ausführen ./
.
Hinweis: Dank des Kommentars von @ Joe müssen symbolische Links bei Backups besonders behandelt werden. Standardmäßig werden sie
rsync
überhaupt nicht verarbeitet. Wenn Sie also wiederherstellen, sind sie nicht vorhanden.
Wie George in seiner Antwort betont hat, können Sie dadurch feststellen, dass Sie eine Datei im aktuellen Arbeitsverzeichnis ausführen ( pwd
).
Ich erinnere mich, dass ich diese Frage vor langer Zeit an meinen Senior gestellt habe. Er sagte, ich solle .
meinen Pfad erweitern, damit er beim a.out
Ausführen im aktuellen Verzeichnis nachschaut und das ausführt. In diesem Fall muss ich nicht tun ./a.out
.
Aber persönlich würde ich dagegen empfehlen. Das ist mir noch nie passiert, aber wenn Sie sich in einem fremden Netzwerkverzeichnis oder so befinden und dort eine böswillige ausführbare Datei mit dem Namen ls
existiert, .
ist es eine sehr schlechte Idee , in Ihrem Pfad zu sein. Nicht, dass Sie sehr oft auf dieses Problem stoßen, wenn Sie nur sagen.
.
zu $PATH
. Sehr gefährliche Idee.
Neben anderen Antworten hier der wesentliche Teil, aus man bash
dem das gut hervorgeht:
BEFEHLSAUSFÜHRUNG Nachdem ein Befehl in Wörter aufgeteilt wurde, ergibt sich ein einfacher Befehl und eine optionale Liste von Argumenten sind die folgenden Aktionen genommen. Wenn der Befehlsname keine Schrägstriche enthält, versucht die Shell zu suchen es. Wenn es eine Shell-Funktion mit diesem Namen gibt, ist diese Funktion wird wie oben in FUNCTIONS beschrieben aufgerufen. Wenn der Name nicht mit a übereinstimmt Funktion sucht die Shell danach in der Liste der eingebauten Shell. Wenn Wird eine Übereinstimmung gefunden, wird das Builtin aufgerufen. Wenn der Name weder eine Shell-Funktion noch eine eingebaute Funktion ist und no enthält Schrägstriche, Bash durchsucht jedes Element des PATH nach einem Verzeichnis, das Beibehalten einer ausführbaren Datei mit diesem Namen.
Ein './' ist sinnvoll, wenn Sie ein für Sie bekanntes und spezifisches Programm ausführen, z. B. Ihr eigenes. Dieses Programm muss in Ihrem aktuellen Verzeichnis vorhanden sein. Ein './' macht keinen Sinn, wenn Sie einen Standardbefehl ausführen, der sich irgendwo im $ PATH befindet. Ein Befehl "welcher Befehl ausgeführt werden soll" gibt an, wo sich der auszuführende Befehl im $ PATH befindet.
$ gcc hello.c -o /path/to/someplace/hello
wird eine ausführbare Datei an einem Ort produzieren. Befindet sich dieser Speicherort in Ihrem Pfad, können Sie die Datei ausführen. Sie können dies skripten, wenn Sie eine Bezeichnung für die Aktion "Kompilieren Sie diesen Quellcode mit dem gcc und platzieren Sie eine ausführbare Datei an einem Ort, der sich auf Ihrem Pfad befindet" erstellen möchten.
Ich würde vorschlagen, dass Sie ein neues Verzeichnis mit dem Namen "testbin" oder etwas in dieser Art erstellen und es in Ihren Pfad einfügen, um Ihre vorhandenen Pfadverzeichnisse sauber zu halten.
./
eliminiert die unnötige Suche nach einem Pfad. ./
zwingen, nur im aktuellen Verzeichnis zu suchen. Wenn wir nicht angeben ./
, wird nach verschiedenen Pfaden gesucht, die in das System eingegeben /usr/bin
wurden /usr/sbin/
, wie z .
"./" bedeutet, dass Sie eine Datei im aktuellen Verzeichnis ausführen möchten. Dies ist eine Abkürzung, mit der Sie den gesamten Pfad eingeben können. Beispiel:
[root@server ~]#/path/to/file/file.pl
ist dasselbe wie:
[root@server file]#./file.pl
Im vorherigen Beispiel haben Sie das Verzeichnis und seine Unterverzeichnisse zum Speicherort der Datei durchsucht und "./" verwendet, um die Datei im aktuellen Verzeichnis auszuführen.
Der davor stehende Befehl " [root @ server ~] # / path / to / file / file.pl " führt die Datei ebenfalls aus, wenn Sie nur faul sind, den Weg zum Dateispeicherort zu " cden ".
Es ist sehr einfach und vielseitig einsetzbar.
/usr/bin
. Zum Beispiel ist Python 2.7, Python 2.6 installiert, aber / usr / bin / python -> python2.7 / usr / local / bin / python -> python2.6Wenn Sie sich im Pfad befinden /usr/local/bin
und Python ausführen, wird immer Python 2.7 ausgeführt. Die Angabe .
übernimmt die ausführbare Datei des aktuellen Ordners.
.
- Stellt immer die Ausführung aus dem aktuellen Verzeichnis dar. Und ..
bedeutet immer führt aus dem vorherigen Verzeichnis.