Warum muss ich vor dem Ausführen eines Programms im aktuellen Verzeichnis './' eingeben?

86

Warum muss ich beim Ausführen eines C-Programms a.out mit dem Ubuntu-Terminal immer ./ vor a.out eingeben, anstatt nur a.out zu schreiben? Gibt es dafür eine Lösung?

    
Prashant Chikhalkar 16.07.2013, 13:58

10 Antworten

113

Wenn Sie den Namen eines Programms wie a.out eingeben, sucht das System nach der Datei in Ihrem PATH. Auf 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

Ihnen ist wahrscheinlich ähnlich. Um dies zu überprüfen, geben Sie echo $PATH in ein Terminal ein.

Das System durchsucht diese Verzeichnisse in der angegebenen Reihenfolge. Wenn es nicht gefunden werden kann, erzeugt das Programm einen Fehler command not found .

Wenn der Befehl mit ./ vorangestellt wird, heißt das: "Vergessen Sie den PATH, ich möchte, dass Sie nur im aktuellen Verzeichnis suchen".

Ebenso können Sie das System anweisen, nur an eine andere bestimmte Stelle zu suchen, indem Sie den Befehl mit einem relativen oder absoluten Pfad voranstellen, wie zum Beispiel:

../ bedeutet im übergeordneten Verzeichnis zB ../hello sucht im übergeordneten Verzeichnis nach hallo.

./Debug/hello : "suche nach hello im Debug-Unterverzeichnis meines aktuellen Verzeichnisses."

oder /bin/ls : "suche nach ls im Verzeichnis /bin "

Standardmäßig befindet sich das aktuelle Verzeichnis nicht im Pfad, da dies als Sicherheitsrisiko gilt. Siehe Warum? nicht standardmäßig im Pfad? auf Superuser für warum.

Es ist möglich, das aktuelle Verzeichnis zu Ihrem PATH hinzuzufügen, aber aus den in der verknüpften Frage angegebenen Gründen würde ich es nicht empfehlen.

    
Warren Hill 16.07.2013, 15:20
24

Der Grund dafür ist einfach.

Angenommen, Sie haben einen Befehl mit demselben Namen wie eine Anwendung im aktuellen Verzeichnis. Wenn Sie dann den Befehl in der Shell ausführen, wird Ihre App anstelle des integrierten Befehls aufgerufen. Dies wäre ein Sicherheitsproblem, wenn nichts anderes.

Wenn Sie ./ voraussetzen müssen, weiß die Shell, dass Sie die Anwendung mit dem angegebenen Namen und nicht mit einem integrierten Befehl mit diesem Namen ausführen möchten.

    
Nathan Osman 16.12.2010 04:21
16

./ führt Dateien aus, die nicht in Ihrem $PATH sind, sondern führt die Datei im aktuellen Verzeichnis aus (oder ein anderes über ./home/stefano/script.sh ). Nun 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. I.e. Wenn Sie eine Datei mit dem Namen ls in Ihrem Home-Verzeichnis haben, wird verhindert, dass bash sie mit der echten ls verwechselt, wenn sie nicht in Ihrem PATH ist. Die Variable PATH definiert auch die Suchreihenfolge:

  • Wenn Sie einen Befehl ausführen oder ein Programm versucht, einen exec syscall (eine spezielle Methode des Kernels, wie Programme gestartet werden) zu erstellen, sucht das System nach der Datei, indem es jedes der Verzeichnisse in Ihrem PATH durchläuft . Sobald das Programm gefunden wurde, wird die Suche abgebrochen, selbst wenn es sich in mehreren Verzeichnissen befindet, und die erste Suche 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 chmod +x finename eingeben.

  • 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 darin enthalten sind - und sie werden pro Benutzer festgelegt - geben Sie echo $PATH ein.

[email protected]:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Wenn Sie eine ausführbare Datei, cat , erstellen und sie nach /usr/local/sbin verschieben, wird sie anstelle des richtigen cat ausgeführt, das sich in /bin befindet. Sie können herausfinden, wo Ihre Dateien sind, indem Sie type cat und whereis cat verwenden.

    
Stefano Palazzo 16.12.2010 04:18
11

Warum müssen Sie ./ eingeben, bevor Sie ein Programm ausführen?

Wenn Sie im Terminal den Namen einer Anwendung eingeben, sagen wir gedit , wird das Terminal in einigen (vordefinierten) Verzeichnissen suchen, die Anwendungen enthalten (die Binärdateien der Anwendungen). Die Namen dieser Verzeichnisse sind in einer Variablen namens PATH enthalten. Sie können sehen, was sich in dieser Variablen befindet, indem Sie echo $PATH ausführen. Sehen Sie diese Verzeichnisse getrennt durch : ? Das sind die Verzeichnisse, in denen das Terminal suchen wird, wenn Sie einfach gedit , nautilus oder a.out eingeben. Wie Sie sehen, ist der Pfad Ihres a.out -Programms nicht vorhanden. Wenn Sie ./a.out ausführen, sagen Sie dem Terminal, dass Sie im aktuellen Verzeichnis suchen und a.out ausführen und nicht in PATH suchen.

Lösung 1

Wenn Sie nicht jedes Mal ./ eingeben möchten, müssen Sie das Verzeichnis a.out in $PATH hinzufügen. In den folgenden Anweisungen gehe ich davon aus, dass der Pfad zu a.out /path/to/programs/ ist, aber Sie sollten ihn in Ihren tatsächlichen Pfad ändern.

  1. Fügen Sie am Ende der Datei ~/.pam_environment :

    einfach die folgende Zeile hinzu
    PATH DEFAULT=${PATH}:/path/to/programs
    

    Quelle: Persistente Umgebungsvariablen

  2. Melden Sie sich ab und wieder an. Sie können nun a.out ohne ./ von einem beliebigen Verzeichnis ausführen.

Wenn Sie andere Programme in anderen Verzeichnissen haben, können Sie diese zur obigen Zeile hinzufügen. Ich würde jedoch empfehlen, ein Verzeichnis namens "myPrograms" zu haben und alle Ihre Programme darunter zu legen.

Lösung 2

  

Hinweis: ändern Sie userName in Ihren tatsächlichen Ubuntu-Benutzernamen.

Was ist, wenn Sie andere Programme ausführen möchten? Und sie sind alle in verschiedenen Ordnern? Nun, eine "besser organisierte" Lösung wäre, einen Ordner namens bin in Ihrem Home-Verzeichnis zu erstellen und symbolische Links (Verknüpfungen) unter diesem Ordner hinzuzufügen. Hier ist wie:

  1. mkdir /home/userName/bin

    • Dadurch wird der Ordner bin in Ihrem Home-Verzeichnis erstellt.
  2. ln -s /path/to/programs/a.out /home/userName/bin

    • Dadurch wird ein "symbolischer Link" (im Grunde eine Verknüpfung) Ihres Programms a.out unter bin .
    • erstellt
  3. Melden Sie sich ab und wieder an. Sie können nun a.out ohne ./ von einem beliebigen Verzeichnis ausführen.

Nun, wenn Sie irgendwo anders ein anderes Programm haben, sagen wir das Programm b.in auf Ihrem Desktop, alles was Sie tun müssen, ist: ln -s /home/userName/Desktop/b.in /home/userName/bin , und Sie können es dann ohne ./ as ausführen gut.

  

Hinweis: Danke an @ Joes Kommentar , wenn Sie Backups machen, müssen symbolische Links speziell behandelt werden. Standardmäßig verarbeitet rsync sie überhaupt nicht, so dass sie bei der Wiederherstellung nicht vorhanden sind.

    
Alaa Ali 16.07.2013 15:27
1

Wie George in seiner Antwort darauf hingewiesen hat, können Sie dadurch feststellen, dass eine Datei im aktuellen Arbeitsverzeichnis ausführt ( pwd ).

Ich erinnere mich, dass ich meine Frage vor längerer Zeit an meinen Senior gestellt habe. Er sagte, ich solle . zu meinem Pfad hinzufügen, so dass ich, wenn ich a.out mache, im aktuellen Verzeichnis nachschaue und das ausführe. In diesem Fall muss ich ./a.out nicht tun.

Aber persönlich würde ich dagegen empfehlen. Es ist mir nie passiert, aber wenn Sie sich in einem Alien-Netzwerkverzeichnis oder etwas befinden und dort eine schädliche ausführbare Datei namens ls existiert, dann ist . in Ihrem Pfad eine sehr schlechte Idee. Nicht, dass Sie sehr oft auf dieses Problem stoßen werden, nur zu sagen.

    
Shrikant Sharat 16.12.2010 04:32
0

A './' macht Sinn, wenn Sie ein Programm ausführen, das für Sie bekannt und spezifisch ist, z. dein eigenes. Dieses Programm muss in Ihrem aktuellen Verzeichnis vorhanden sein. Ein './' macht keinen Sinn, wenn Sie einen Standardbefehl ausführen, der sich irgendwo in $ PATH befindet. Ein Befehl "which command-to-run" teilt Ihnen mit, wo sich der Befehl zum Ausführen in $ PATH befindet.

    
user7346 16.12.2010 12:06
0
$ gcc hello.c -o /path/to/someplace/hello

erzeugt an einem bestimmten Ort eine ausführbare Datei. Wenn sich dieser Pfad auf Ihrem Pfad befindet, können Sie die Datei ausführen. Sie können dies skripten, wenn Sie eine Bezeichnung für die Aktion erstellen möchten: "kompilieren Sie diesen Quellcode mit dem gcc und legen Sie eine ausführbare Datei an einem Ort auf Ihrem Pfad ab"

Ich würde vorschlagen, dass Sie ein neues Verzeichnis namens "testbin" oder etwas dieser Art erstellen und es auf Ihren Pfad setzen, um Ihre bestehenden Pfadverzeichnisse sauber zu halten.

    
Jon Kiparsky 16.07.2013 20:35
0

./ eliminiert unnötige Suche nach einem Pfad. ./ force, um nur im aktuellen Verzeichnis zu suchen. Wenn wir ./ nicht angeben, sucht es verschiedene Pfadeinträge in das System wie /usr/bin , /usr/sbin/ , etc.

    
user175959 17.07.2013 13:11
0

"./" bedeutet, dass Sie eine Datei im aktuellen Verzeichnis ausführen wollen. Es ist eine Abkürzung für die Eingabe des gesamten Pfades, zum Beispiel:

[[email protected] ~]#/path/to/file/file.pl

ist dasselbe wie:

[[email protected] file]#./file.pl

Im vorherigen Beispiel sind Sie durch das Verzeichnis und seine Unterverzeichnisse zum Speicherort der Datei gegangen und haben "./" verwendet, um die Datei im aktuellen Verzeichnis auszuführen.

der vor ihm " [root @ server ~] # / pfad / zu / file / file.pl " wird auch die Datei ausführen, wenn Sie faul sind, Ihren Weg zu der Datei "cd" Ort.

    
Khaled Moustafa 25.04.2014 02:20
-4

Es ist sehr einfach und hat viele Anwendungen.

  1. Wenn mehrere Versionen der gleichen Anwendung installiert sind, wird sie in einem anderen Pfad verfügbar sein, aber ein Softlink zu Ihrer Binärdatei kann in /usr/bin erstellt werden. Zum Beispiel ist Python 2.7, Python 2.6 installiert, aber / usr / bin / python - & gt; python2.7 / usr / local / bin / python - & gt; python2.6

Wenn Sie sich im Pfad /usr/local/bin befinden und Python ausführen, wird Python 2.7 immer ausgeführt. Wenn Sie . angeben, wird die ausführbare Datei des aktuellen Ordners verwendet.

  1. . - stellt immer die Ausführung aus dem aktuellen Verzeichnis dar. Und .. bedeutet immer die Ausführung aus dem vorherigen Verzeichnis.
Ramjee Anna 17.07.2013 11:12

Tags und Links