
In einem Verzeichnis /home/pi/remoteinfo/temp/code
gibt es also ein C-Programm namens a.out
und eine Shell-Datei namens tempstart.sh
.
Die Datei tempstart.sh enthält Folgendes:
#!/bin/bash
./a.out
Wenn ich jetzt drin bin, /home/pi/remoteinfo/temp/code
kann ich tippen ./tempstart.sh
und mein Programm wird ausgeführt.
tempstart.h
Aber wenn ich versuche , es von einem beliebigen Ort außerhalb des Verzeichnisses auszuführen , erhalte ich die Meldung line 3: ./a.out: No such file or directory
:
Was ist passiert und wie kann ich das Problem beheben?
Ich verwende einen Raspberry Pi 3 mit dem Standardbetriebssystem
Antwort1
Was passiert, ist, dass das Skript den Befehl im aktuellen Arbeitsverzeichnis ausführt ./a.out
, da dies im Skript geschrieben ist. Wenn Sie das Skript von einem anderen Ort aus ausführen, wird Ihre Binärdateinicht indas aktuelle Arbeitsverzeichnis, wodurch die Shell den angezeigten Fehler ausgibt.
Wenn Sie das Skript zum Aufrufen der Binärdatei verwenden möchten, unabhängig davon, aus welchem Verzeichnis es aufgerufen wird, haben Sie mindestens vier Optionen:
- Legen Sie es
a.out
in ein Verzeichnis ab, das sich bereits in Ihrem Verzeichnis befindetPATH
, und geben Sie nicht mehr das aktuelle Arbeitsverzeichnis als Speicherort von ana.out
(verschieben Sie es z. B.a.out
nach$HOME/bin/a.out
und ändern Sie das Skript so, dass es einfach ausgeführt wird,a.out
anstatt./a.out
). - Lassen Sie das Skript explizit den vollständigen Pfad zur Binärdatei aufrufen (z. B. statt
./a.out
, stattdessen/path/to/the/location/of/a.out
). - Fügen Sie das Skript hinzu zues ist
PATH
der Speicherort des Skripts und geben Sie nicht das aktuelle Verzeichnis als Speicherort der Binärdatei an (z. B.PATH="$PATH:/path/to/the/binary"; a.out
- Habe das SkriptSatzdas Arbeitsverzeichnis zum Speicherort des Skripts, bevor Sie versuchen, es auszuführen (zB
cd /path/to/the/binary; ./a.out
)
Antwort2
./script.sh
würde davon ausgehen, dass Sie es im selben Verzeichnis ausführen.
Angenommen a.out
, es befindet sich in /var/run/a.out
. Sie können es so ändern, tempstart.sh
dass der vollständige Dateipfad enthalten ist.
An diesem Punkt können Sie das Skript von überall aus ausführen (vorausgesetzt, a.out
Sie müssen sich beim Ausführen nicht in einem bestimmten Verzeichnis befinden).