Problema con Automator y bash script

Estoy creando un servicio de automatización, y la primera parte toma archivos y los RAR usando un script bash

Entonces, en Automator, tengo una acción Obtener elementos del buscador especificados para probar el flujo de trabajo y luego el script bash

F=''
for i in "$@"; do 
    F="$F \"${i//\"/\\\"}\""
done

/usr/local/bin/rar a ~/archive.rar $F

así que simplemente toma las rutas de los archivos, las comillas y luego ejecuta el comando RAR con todos los archivos como argumentos. Cuando ejecuto esto, el automatizador me da el error.

No se puede abrir "/Users/user/test.txt" No existe tal archivo o directorio

No se puede crear ~/archive.rar No existe tal archivo o directorio

No tengo idea de por qué está recibiendo esos errores. Cuando agrego un eco al último comando

echo /usr/local/bin/rar a ~/archive.rar $F

Los resultados son exactamente el comando que necesito. Puedo copiarlo y pegarlo en la terminal y funciona.

¿Automator ejecuta scripts bash de manera diferente a como se ejecutarían en la terminal?

~no se expande dentro de las comillas, por lo que necesita al menos ~/"archive.rar"allí. Y sospecharía algunos problemas con el manejo de espacios y las citas también para $F. ¿Funciona si lo ejecuta directamente en la Terminal?
Ups, sí, no quise tener comillas alrededor de ~/archive.rar. y, de hecho, sí, tampoco funciona en la terminal, el error dice que aún no puede abrir los archivos en los argumentos
¿Por qué preprocesas $@ en $F, no puedes pasar "$@"a rar directamente?
Pasar "$@" pasaría todas las rutas de archivo como 1 cadena larga. Cada argumento de ruta de archivo debe estar entre comillas
Hay algunas cotizaciones automáticas extrañas cuando se llama al comando que lo estropea. Dado que hacer eco del comando en realidad muestra el comando correcto, puedo simplemente canalizarlo a bash, y funciona bien jajaja ...
¿Lo intentaste?

Respuestas (2)

bashhace una expansión $@diferente a todas las demás variables de entorno para preservar los espacios en blanco, etc. en los argumentos. de bash(1):

@ Expands  to  the  positional  parameters,  starting from one.  When the expansion occurs
  within double quotes, each parameter expands to a  separate  word.   That  is,  "$@"  is
  equivalent  to  "$1"  "$2" ...  If the double-quoted expansion occurs within a word, the
  expansion of the first parameter is joined with the beginning part of the original word,
  and  the  expansion  of  the last parameter is joined with the last part of the original
  word.  When there are no positional parameters, "$@" and $@  expand  to  nothing  (i.e.,
  they are removed).

Entonces, básicamente, debería poder llamar rardentro de la acción Shell Script sin ningún análisis:

/usr/local/bin/rar a ~/archive.rar "$@"
Ja, esto funcionó y ahora me sentí estúpido. Gracias hombre.

Citas automáticas extrañas detrás de escena que no pude entender. Así que hice esta solución para que hiciera lo que quería, aunque no es exactamente una solución:

echo /usr/local/bin/rar a ~/archive.rar $F | bash
Agregue los scripts de trabajo para que otros también puedan beneficiarse.