/bin/sh: rm: Befehl nicht gefunden

Ich habe Probleme mit einigen Anwendungen, die die AppleScript- shell scriptFunktion verwenden. Beispielsweise zeigen die Deinstallationsskripte von Growl einen Fehler:

error "/bin/sh: rm: command not found" number 127

Die Quelle des Skripts ist

display dialog (localized string "title")
if button returned of result = "OK" then
    try
        quit application id "com.Growl.GrowlHelperApp"
    end try
    try
        quit application id "com.Growl.MenuExtra"
    end try
    do shell script "rm -rf /Library/PreferencePanes/Growl.prefPane ~/Library/PreferencePanes/Growl.prefPane" with administrator privileges
    display dialog (localized string "succeeded") buttons {localized string "OK"} default button 1
end if

Ich habe echo $PATH > /omg.txt &&den Befehl hinzugefügt, um zu sehen, was der Suchpfad für rm ist. Aber es hat einen seltsamen Wert:

$ cat /omg.txt 
â

Was kann ich machen? Ich verstehe nicht, was los ist. sudo /bin/shWenn ich nur im Terminal laufe , ist die Umgebung in Ordnung!

Jetzt weiß ich, dass ich zum Deinstallieren von Growl einfach den Befehl ausführen kann, den es versucht, im Terminal auszuführen. Aber es wird dieses Problem nicht lösen, verschieben Sie es einfach, bis eine andere Anwendung mit demselben Fehler fehlschlägt (es ist schon einmal passiert).

Antworten (3)

Laut der offiziellen Dokumentation von Apple ist es beabsichtigt, dass Shell-Skripte, die von der do shell scriptAktion von AppleScript aufgerufen werden, die Variable nicht$PATH von der Umgebung Ihrer Login-Shell erben.

Dementsprechend weist Apple Benutzer an, vollständige Pfade zu Befehlen zu verwenden, wenn Shell-Skripte von AppleScript aufgerufen werden, anstatt sich auf die $PATH-Variable in der Umgebung zu verlassen.

Im Skript in Ihrem Beispiel könnten Sie rmdurch ersetzen/bin/rm

Gemäß der oben verlinkten Dokumentation ist dies das beabsichtigte, dokumentierte Verhalten; Ein Skript, das erwartet, dass die Umgebung $PATHfür Befehle festgelegt wird, do shell scriptist ein Skript mit einem Fehler.

Wenn Sie jedoch unbedingt relative Pfade verwenden und diese mit $PATH vervollständigen müssen, können Sie jedem Shell-Skript, das von aufgerufen wird, do shell scriptden Befehl voranstellenPATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin;

Dies funktioniert nicht für alle anderen Skripte :(
Skripte, die darauf angewiesen sind, dass die $PATH-Variable gesetzt wird, sind laut Dokumentation fehlerhaft. Siehe überarbeitete Antwort.

hotfix = Geben Sie den Ort des rmBefehls an:

do shell script "/bin/rm -rf /Library/PreferencePanes/Growl.prefPane ~/Library/PreferencePanes/Growl.prefPane" with administrator privileges
das löst das problem nicht ein für alle mal :(

Sie könnten tatsächlich Daniels Vorschlag zum Exportieren von Pfaden verwenden, aber speichern Sie es als Skript für sich selbst (nennen Sie es "dss" für do Shell Skript oder so) und platzieren Sie es in usr/local/bin . Auf diese Weise können Sie das nächste Mal, wenn Sie ein osa- Skript wie die Growl-Deinstallation ausführen müssen , Ihr Skript von der Befehlszeile aus aufrufen, um $PATH zu setzen, den osa- Job auszuführen und dann fertig zu sein. Keine Dauerlösung, aber sehr praktikabel.

Wird der osa seine geerbte Umgebung an Skripte weitergeben, mit denen er spawnt do shell script?
Ich glaube schon, zumindest wenn das Skript Subroutinen verwendet. Subroutinen eines übergeordneten Skripts erben die Umgebungsvariablen für diesen Prozess.