/bin/sh: rm: comando no encontrado

Tengo problemas con algunas aplicaciones que utilizan shell scriptla función AppleScript. Por ejemplo, los scripts de desinstalación de Growl muestran un error:

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

La fuente del guión es

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

He agregado echo $PATH > /omg.txt &&al comando para ver cuál es la ruta de búsqueda de rm. Pero tiene un valor extraño:

$ cat /omg.txt 
â

¿Qué puedo hacer? No entiendo lo que está pasando. Cuando acabo de ejecutar sudo /bin/shen Terminal, ¡el entorno está bien!

Ahora, sé que para desinstalar Growl solo puedo ejecutar el comando que intenta ejecutar en la Terminal. Pero no resolverá este problema, solo pospóngalo hasta que otra aplicación falle con el mismo error (ocurrió antes).

Respuestas (3)

De acuerdo con la documentación oficial de Apple , es por diseño que los scripts de shell invocados desde la do shell scriptacción de AppleScript no heredan la $PATHvariable del entorno de shell de inicio de sesión.

En consecuencia, Apple indica a los usuarios que utilicen rutas completas a los comandos al invocar secuencias de comandos de shell desde AppleScript en lugar de confiar en la variable $PATH del entorno.

En el script de su ejemplo, podría reemplazarlo rmcon/bin/rm

De acuerdo con la documentación mencionada anteriormente, este es el comportamiento previsto y documentado; una secuencia de comandos que espera que el entorno $PATHesté configurado para do shell scriptlos comandos es una secuencia de comandos con un error.

Dicho esto, si es absolutamente necesario usar rutas relativas y usar $PATH para completarlas, puede prefijar cualquier script de shell llamado con do shell scriptel comandoPATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin;

esto no funcionará para todos los demás scripts :(
Los scripts que dependen de la variable $PATH para establecerse tienen, según la documentación, errores. Ver respuesta revisada.

hotfix = dar la ubicación del rmcomando:

do shell script "/bin/rm -rf /Library/PreferencePanes/Growl.prefPane ~/Library/PreferencePanes/Growl.prefPane" with administrator privileges
no resolverá el problema de una vez por todas :(

En realidad, podría usar la sugerencia de Daniel de exportar rutas, pero guárdelo como un script en sí mismo (llámelo "dss" para hacer script de shell, o algo así) y colóquelo en usr/local/ bin . De esa manera, la próxima vez que necesite ejecutar un script osa como la desinstalación de Growl, puede llamar a su script desde la línea de comando para establecer $PATH, ejecutar el trabajo osa y luego terminar. No es una solución permanente, pero es muy factible.

¿Pasará el osa su entorno heredado a los scripts con los que genera do shell script?
Creo que sí, al menos si el script usa subrutinas. Las subrutinas de un script principal heredarán las variables de entorno para ese proceso.