2012-03-28 22 views
2

ich für diese senario gegoogelt, aber es ist überschwemmt mit den Ergebnissen, wie man einen relativen Pfad in einen absoluten zu verwandeln (die funktionieren würde, aber ich fühle es ist ein einfacher Weg)Ausführen relativer Pfad ausführbar in Bash-Skript

ich habe folgendes Szenario:

$ls ../ 
executable1 dir1 
$ 
$ls 
shellscript1 
$ 
$cat ./shellscript1 
#!/bin/bash 
#Run executable1, which I know is one dir up towards root 
../executable1 arg1 arg2 arg3 etc 
exit 0 
#----End Of Script---- 
$ 
$./shellscript1 
./shellscript1: line 3: ../executable1: No such file or directory 

Im Grunde muss ich mit einem relativen Pfad von einem bash-Skript eine ausführbare Datei aufrufen. Es funktioniert gut in einer Bash-Shell, aber in einem Skript kann es den Pfad nicht auflösen. Ich habe überprüft, dass das Arbeitsverzeichnis das ist, was ich erwarte (z. B. dir1). Gibt es einige call oder exec wie Befehl brauche ich davor? Ich habe versucht, sh ../executable1, aber natürlich Bash bimps bei der ausführbaren Datei.

+1

Weitere Informationen sind erforderlich. Wenn du das testest, wo bist du? Geben Sie pwd ein. Die einzige Information, die ich nach der Katze nicht sehe, ist deine ausführbare Datei1. Versuch das. Es sollte nicht funktionieren. – octopusgrabbus

+0

Es gibt einige Probleme mit Ihrem Shell-Befehlsverlauf: ls gab Shellscript1 zurück, dann Sie cat Shellscript, das sollte nicht da sein, da ls Sie nicht zeigte ... und Sie haben das Skript. Du hast dann ./shellscript (das ist nicht da) aufgerufen. Es hat ./shellscript1: line 3 gedruckt ... etwas stimmt nicht mit Ihrer Anfrage. Es ist sicher 100%, dass Sie bei Dateinamen einen Syntaxfehler haben. Überprüfe, ob etwas vorhanden ist, gehe nicht davon aus, dass es da ist. – dAm2K

+0

Stellen Sie sicher, dass keines davon symbolisch ist. – pizza

Antwort

3

Ich habe es gerade getestet, es basiert auf Ihren Informationen und scheint gut zu funktionieren.

$ ls ../ 
dir1 executable1 executable1.c 
$ 
$ cat ../executable1.c 
#include <stdio.h> 
int main(int argc, char ** argv) { 
     while (*argv) {printf ("<%s> ",*argv++);} 
     printf("\n"); 
     return 0; 
} 
$ cat ./shellscript1 
$ 
#!/bin/bash 
#Run executable1, which I know is up dir up towards root 
../executable1 arg1 arg2 arg3 etc 
exit 0 
#----End Of Script---- 
$ 
$ ./shellscript1 
<../executable1> <arg1> <arg2> <arg3> <etc> 
$ 
$ ls -l ../ ./ 
./: 
total 4 
-rwxr-xr-x 1 pizza pizza 133 2012-03-29 00:19 shellscript1 

../: 
total 16 
drwxr-xr-x 2 pizza pizza 4096 2012-03-29 00:24 dir1 
-rwxr-xr-x 1 pizza pizza 6501 2012-03-29 00:20 executable1 
-rw-r--r-- 1 pizza pizza 126 2012-03-29 00:20 executable1.c 
+0

Ich habe keine Ahnung, was genau ich geändert habe aber es funktioniert jetzt. Ich applaudiere Ihrer Bemühung und gehe so weit, ein vollständiges Modell zu kodieren. Ich würde Ihnen eine weitere Aufwertung geben, wenn ich könnte. (Vielleicht werde ich eine andere Ihrer Antworten finden) – Huckle

1

Könnte die Berechtigungen auf .. oder ../executable1

Benutzer fällig ./shellscript Ausführung sollte auf .. UND ../executable1 Berechtigungen auszuführen. Tut er?

+0

Sonst würde es einen Berechtigungsfehler erzeugen, nicht wahr: './l2: Zeile 1: ../l1: Berechtigung verweigert' Aber es ist eine 'keine solche Datei oder kein Verzeichnis'. –

+0

Beide existieren unter meinem Home-Verzeichnis, also habe ich rwx auf was auch immer ich brauche. – Huckle

+0

Es kann schwierig sein. Wenn du keine exec-Berechtigung für dir hast, kannst du nichts "drinnen" sehen, also bekommst du "keine solche Datei oder dir" .. auch (nicht in diesem Fall aber), wenn du keine exec-Berechtigung für dich hast versuchen Sie, die Datei aus ihrem Verzeichnis mit "Datei" anstelle von "./file" auszuführen, dann erhalten Sie "keine solchen Befehl" .. denke, die msg könnte auf den Geschmack von OS abhängen. – Kashyap