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?
command-line
bash
Prashant Chikhalkar
quelle
quelle
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 eingestelltIhre 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
: "suchehello
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.
quelle
.
zu IhrenPATH
(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 arbeitencat
odergrep
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.quelle
./
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 verwechselnls
. 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
.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 Dateicat
befindet/bin
. Sie können herausfinden, wo Ihre Dateien sind durch die Verwendungtype cat
undwhereis cat
.quelle
gcc
, wodurch das Ausführungsbit automatisch gesetzt wird.Warum müssen Sie
./
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 enthaltenPATH
. Sie können sehen, was in dieser Variablen enthalten ist, indem Sie ausführenecho $PATH
. Sehen Sie diese Verzeichnisse getrennt durch:
? Das sind die Verzeichnisse , die das Terminal gehen sucht in, wenn Sie nur gebengedit
,nautilus
odera.out
. Wie Sie sehen, ist der Pfad Ihresa.out
Programms nicht vorhanden. Wenn Sie dies tun./a.out
, teilen Sie dem Terminal mit, dass Sie in das aktuelle Verzeichnis schauen und ausführena.out
und nicht hineingehenPATH
.Lösung 1
Wenn Sie nicht
./
jedes Mal etwas eingeben möchten , müssen Sie dasa.out
Verzeichnis hinzufügen$PATH
. In den folgenden Anweisungen gehe ich davon aus, dass der Pfad zua.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
: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.
Lösung 2
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 erstellenbin
.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 tunln -s /home/userName/Desktop/b.in /home/userName/bin
:, und Sie können es dann auch ohne ausführen./
.quelle
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 beima.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.quelle
.
zu$PATH
. Sehr gefährliche Idee.Neben anderen Antworten hier der wesentliche Teil, aus
man bash
dem das gut hervorgeht:quelle
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.
quelle
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.
quelle
./
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 .quelle
"./" 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:
ist dasselbe wie:
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 ".
quelle
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.quelle