Problem mit Automator und Bash-Skript

Ich mache einen Automator-Dienst, und der erste Teil nimmt Dateien und RARs sie mit einem Bash-Skript

In Automator habe ich also eine Aktion Get Specific Finder Items, um den Workflow zu testen, und dann das Bash-Skript

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

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

Es nimmt also einfach die Dateipfade, setzt sie in Anführungszeichen und führt dann den RAR-Befehl mit allen Dateien als Argumente aus. Wenn ich dies ausführe, gibt mir Automator den Fehler

„/Users/user/test.txt“ kann nicht geöffnet werden. Keine solche Datei oder Verzeichnis

~/archive.rar kann nicht erstellt werden. Keine solche Datei oder Verzeichnis

Keine Ahnung, warum es diese Fehler bekommt. Wenn ich dem letzten Befehl ein Echo hinzufüge

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

Die Ergebnisse sind genau der Befehl, den ich brauche. Ich kann es kopieren und im Terminal einfügen und es funktioniert.

Führt Automator Bash-Skripte anders aus als im Terminal?

~wird nicht innerhalb von Anführungszeichen erweitert, also brauchen Sie zumindest ~/"archive.rar"dort. Und ich würde einige Probleme beim Umgang mit Leerzeichen und Zitieren auch für vermuten $F. Funktioniert es, wenn Sie es direkt im Terminal ausführen?
Ups, ja, ich wollte keine Anführungszeichen um die Datei ~/archive.rar setzen. und tatsächlich, ja, es funktioniert auch nicht im Terminal, der Fehler besagt, dass es die Datei (en) in den Argumenten immer noch nicht öffnen kann
Warum verarbeiten Sie $@ in $F vor, können Sie nicht "$@"direkt an rar übergeben?
Das Übergeben von "$@" würde alle Dateipfade als eine lange Zeichenfolge übergeben. Jedes Dateipfadargument muss in Anführungszeichen gesetzt werden
Es gibt ein seltsames automatisches Zitieren, wenn der Befehl aufgerufen wird, der es vermasselt. Da das Echo des Befehls tatsächlich den richtigen Befehl anzeigt, kann ich ihn einfach an Bash weiterleiten, und es funktioniert gut, lol ....
Hast Du es versucht?

Antworten (2)

bashführt eine Erweiterung $@anders als alle anderen Umgebungsvariablen aus, um Leerzeichen usw. in Argumenten beizubehalten. Von 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).

rarSie sollten also im Grunde in der Lage sein , innerhalb der Shell-Skriptaktion ohne Parsing aufzurufen :

/usr/local/bin/rar a ~/archive.rar "$@"
Ha, das hat funktioniert und jetzt kam ich mir dumm vor. Danke, Mann.

Seltsames automatisches Zitieren hinter den Kulissen, das ich nicht herausfinden konnte. Also habe ich gerade diese Problemumgehung durchgeführt, damit es das tut, was ich wollte, obwohl es nicht gerade eine Lösung ist:

echo /usr/local/bin/rar a ~/archive.rar $F | bash
Bitte fügen Sie die funktionierenden Skripte hinzu, damit auch andere davon profitieren können.