execvp: Keine solche Datei oder Verzeichnis

14500
Will

Ich habe ein Skript geschrieben ~/_bin/bcg, um ein anderes Skript aufzurufen, das ein zufälliges Bild aus einem Verzeichnis mithilfe von Gimp neu formatiert und dann in eine andere Datei zurückschreibt. Mein (Toplevel) -Skript setzt hsetrootdann den X-Hintergrund auf dieses Bild.

Das einzige Problem ist, dass !/_bin/auramein Skript stoppt, sobald ich das Skript des anderen Mannes mit exec anrufe .

  1. Gibt es eine Möglichkeit, Programme und Skripte ohne exec aufzurufen?
  2. Gibt es einen Weg, um zu verhindern, dass der Executor mein Skript guillotiert?

Wenn ich Dinge ohne Exec ausführen, bekomme ich:

execvp: Keine solche Datei oder Verzeichnis

Ich nehme an, dass dies bedeutet, dass bash implizit ein Programm verwendet execvp, um jede Zeile zu parsen, und das Programm nicht finden kann (oder nicht ausgeführt wird) ~/_bin/aura.

Ich kann jede Zeile am Terminal eingeben und bekommen, was ich will. Ich kann einfach nicht alles in ein Skript schreiben, aber das ist es, was ich will.

Was kann ich machen?

#!/bin/bash if [ -f ~/.bcg.bmp ] then rm ~/.bcg.bmp fi ~/_bin/aura "~/_wall"; hsetroot -center ~/.bcg.bmp 
2

2 Antworten auf die Frage

2
Kyle Jones

Normalerweise, wenn Sie einen Befehl in einem Bash-Skript aufrufen, wartet die Shell, bis der Befehl abgeschlossen ist, und führt dann den nächsten Befehl aus. Wenn Sie verwenden exec, sagen Sie der Shell, dass sie sich durch den Befehl ersetzt, der gerade ausgeführt wird, dh es gibt keine Shell, sobald der Befehl gestartet wird. Wenn der Befehl beendet ist, ist es auch so, als wäre das ursprüngliche Skript ebenfalls beendet. Sie müssen Ihren Befehl ohne ausführen, execwenn das Skript nach Abschluss des Befehls weiter ausgeführt werden soll.

execvp: No such file or directorysieht nicht aus wie eine bash-Fehlermeldung. Es stammt wahrscheinlich aus dem auraSkript, das versucht, etwas auszuführen, das in Ihrem Suchpfad nicht gefunden werden kann.

"Keine solche Datei oder Verzeichnis" ist bash und ist ein Fehler von execvp. Kalle vor 12 Jahren 0
0
technosaurus

Wenn Sie ~ zitieren, verliert es sein spezielles Verhalten, Sie können jedoch $ HOME verwenden

#~/_bin/aura "~/_wall"; ~/_bin/aura "$HOME/_wall";