Problem z Automatorem i skryptem bash


0

Tworzę usługę automatora, a pierwsza część pobiera pliki i RAR-y za pomocą skryptu bash

Tak więc w Automatorze mam akcję Get Specified Finder, aby przetestować przepływ pracy, a następnie skrypt bash

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

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

więc po prostu pobiera ścieżki plików, umieszcza wokół nich cytaty, a następnie uruchamia komendę RAR ze wszystkimi plikami jako argumentami. Kiedy to uruchomię, automat daje mi błąd

Nie można otworzyć „/Users/user/test.txt” Brak takiego pliku lub katalogu

Nie można utworzyć ~ / archive.rar Brak takiego pliku lub katalogu

Nie ma pojęcia, dlaczego tak się dzieje. Kiedy dodaję echo do ostatniego polecenia

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

Wyniki są dokładnie tym, czego potrzebuję. Mogę go skopiować i wkleić w terminalu i to działa.

Czy automatyzator uruchamia skrypty bash inaczej, niż uruchamia się w terminalu?


~ nie jest rozszerzany w cudzysłowie, więc potrzebujesz przynajmniej ~/"archive.rar" tam. I podejrzewałbym pewne problemy z obsługą przestrzeni i cytowaniem również $F. Czy to działa, jeśli uruchamiasz go bezpośrednio w Terminalu?
nohillside

Ups, tak, nie chciałem mieć cytatów w ~ / archive.rar. a właściwie tak, to też nie działa w terminalu, błąd mówi, że nadal nie można otworzyć pliku (ów) w argumentach
user3321819

Dlaczego przetwarzasz $ @ w $ F, nie możesz przejść "$@" rar bezpośrednio?
nohillside

Przekazanie „$ @” przekaże wszystkie ścieżki do pliku jako jeden długi ciąg. Każdy argument ścieżki pliku musi być ujęty w cudzysłów
user3321819

Jest pewne dziwne automatyczne cytowanie, gdy nazywa się to polecenie, które je skręca. Ponieważ echo polecenia faktycznie wyświetla poprawne polecenie, mogę po prostu przesłać go do basha i działa dobrze.
user3321819

Odpowiedzi:


1

bash robi ekspansję $@ inne niż wszystkie inne zmienne środowiskowe, aby zachować białe argumenty w argumentach. Z 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).

Więc zasadniczo powinieneś móc dzwonić rar w akcji skryptu powłoki bez żadnego parsowania:

/usr/local/bin/rar a ~/archive.rar "$@"

Ha to zadziałało, a teraz czuję się głupio. Dzięki.
user3321819

-1

Dziwne auto-cytowanie za kulisami, których nie mogłem zrozumieć. Więc po prostu zrobiłem to obejście, aby zrobić to, co chciałem, chociaż nie do końca:

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

Dodaj skrypty robocze, aby inni mogli z nich skorzystać.
nohillside
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.