2011-01-14 1 views
2

Ich versuche, ein Bash-Skript zu schreiben, das Verzeichnis ändert und dann ein vorhandenes Skript in dem neuen Arbeitsverzeichnis ausführt.Kurzes Bash-Skript zum Ausführen eines Skripts in einem angegebenen Ordner?

Dies ist, was ich bisher:

#!/bin/bash 
cd /path/to/a/folder 
./scriptname 

skript ist eine ausführbare Datei, die in/Pfad vorhanden ist/to/a/Ordner - und (unnötig zu sagen), ich die Erlaubnis, dass zu laufen haben Skript.

Allerdings, wenn ich diesen Geist betäubend einfaches Skript ausführen (siehe oben), erhalte ich die Antwort:

skript: Keine solche Datei oder das Verzeichnis

Was bin ich ?! Die Befehle funktionieren wie erwartet, wenn sie am CLI eingegeben werden. Daher kann ich die Fehlermeldung nicht erklären. Wie behebe ich das?

+0

Hmm, nach den vielen (abwechslungsreichen) Antworten zu urteilen - einschließlich ein oder zwei, die sicherlich übertrieben sein müssen - kann ich nicht anders, als zu fragen - sicherlich muss es eine einfache Möglichkeit geben, in einen Ordner zu wechseln und ein Skript zu betreiben Mappe? – skyeagle

+0

Sie haben das Skript nicht in diesen Ordner kopiert. ./scriptname bedeutet, dass sich das Skript in diesem Ordner befindet, was nicht der Fall ist. Rufen Sie das Skript auf, indem Sie den richtigen Pfad angeben. – BZ1

+0

Könnten Sie Folgendes als Alias ​​für das hinzufügen, was Sie wollen? "bash /path/to/script/script.sh" – Hemm

Antwort

3
cd /path/to/a/folder 
pwd 
ls 
./scriptname 

which'll Sie zeigen, was es denkt, es tut.

+0

Ich mache das schon (ich habe das in meinem OP nicht gezeigt - um die Dinge einfach zu halten).pwd zeigt an, dass die CD funktioniert hat und ls zeigt, dass die Datei da ist - daher meine Verwirrung über die Fehlermeldung Ich bekomme – skyeagle

+0

Ich akzeptiere dies als die nächste Antwort. Ich habe Auto-Competition am CLI verwendet - also habe ich nicht die Erweiterung .sh eingegeben. In dem Skript muss ich den vollständigen Dateinamen verwenden – skyeagle

+0

Oh, Sie benötigen auf jeden Fall den vollständigen Dateinamen. – Satya

4

Blick auf Ihr Skript lässt mich denken, dass das Skript, das Sie ein Skript starten möchten, das im ursprünglichen Verzeichnis befindet. Da Sie Ihr Verzeichnis vor der Ausführung ändern, wird es nicht funktionieren.

Ich schlage vor, das folgende modifizierte Skript:

#!/bin/bash 
SCRIPT_DIR=$PWD 
cd /path/to/a/folder 
$SCRIPT_DIR/scriptname 
+0

Nein, Sie müssen mich falsch verstanden haben. Ich möchte Skripte in/path/to/a/folder ausführen (deshalb "cd/path/to/a/folder" zuerst). – skyeagle

+0

Ok ich verstehe. Ich nehme an, alles ist in Ordnung, wenn Sie es mit der Hand laufen. Mein einziger Vorschlag wäre bisher, die "-xv" -Optionen zu Ihrer "#!" - Zeile hinzuzufügen und zu prüfen, was gedruckt wurde. – gabuzo

1

Normalerweise habe ich so etwas wie dies in meinem nützlichen Skript-Verzeichnis:

#!/bin/bash 

# Provide usage information if not arguments were supplied 
if [[ "$#" -le 0 ]]; then 
     echo "Usage: $0 <executable> [<argument>...]" >&2 

     exit 1 
fi 

# Get the executable by removing the last slash and anything before it 
X="${1##*/}" 

# Get the directory by removing the executable name 
D="${1%$X}" 

# Check if the directory exists 
if [[ -d "$D" ]]; then 
     # If it does, cd into it 
     cd "$D" 
else 
     if [[ "$D" ]]; then 
       # Complain if a directory was specified, but does not exist 
       echo "Directory '$D' does not exist" >&2 

       exit 1 
     fi 
fi 

# Check if the executable is, well, executable 
if [[ -x "$X" ]]; then 
     # Run the executable in its directory with the supplied arguments 
     exec ./"$X" "${@:2}" 
else 
     # Complain if the executable is not a valid 
     echo "Executable '$X' does not exist in '$D'" >&2 

     exit 1 
fi 

Verbrauch:

$ cdexec 
Usage: /home/archon/bin/cdexec <executable> [<argument>...] 
$ cdexec /bin/ls ls 
ls 
$ cdexec /bin/xxx/ls ls 
Directory '/bin/xxx/' does not exist 
$ cdexec /ls ls 
Executable 'ls' does not exist in '/' 
+0

Ähm, einige Kommentare im Skript wäre nett - im Moment sieht es einfach wie Perl (dh Kauderwelsch) für mich aus .. – skyeagle

+0

@skyeagle: Ich habe einige Kommentare und ein Anwendungsbeispiel hinzugefügt – thkala

+0

@thkala: wie Whis Schrift umschreiben als eine Funktion? – niXman

0

Eine Quelle für solche Fehlermeldungen unter diesen Bedingungen ist eine gebrochene Symlink.

Sie sagen jedoch, das Skript funktioniert, wenn über die Befehlszeile ausgeführt. Ich würde auch überprüfen, ob das Verzeichnis ein Symlink ist, der etwas anderes als das tut, was Sie erwarten.

Funktioniert es, wenn Sie es in Ihrem Skript mit dem vollständigen Pfad aufrufen, anstatt CD zu verwenden?

Was ist, wenn von der Kommandozeile so genannt?

Verwandte Themen