rsync unexpected remote arg

Fórumok

van a köv parancs, amit egy shell script rak össze

/usr/local/bin/rsync -avzu -e ssh /export/dirdir user@host:/export/dirdir >/export/rsync/log/201414142114/dirdir.log

ha a shellbol futtatom $CMD módon, akkor ezt mondja:

Unexpected remote arg: user@host:/export/dirdir

persze ha bemásolom, akkor jó...ha ledobom a végéről a redirectet, akkor is jó???
???

Hozzászólások

Mit értesz azon, hogy "$CMD módon"?
CMD="rsync ...", majd $CMD?

Próbáld így:

eval "$CMD"

Most nincs kedvem azon gondolkodni, ez bármiben is különbözik-e attól, mintha leírnád a $CMD-t, mindenesetre az eval, a megfelelően escape-elt idézőjel, aposztrof jól jöhet.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Azért, mert ha jól sejtem mondjuk még az átirányítást is generálod bele a parancsot tartalmazó változóba. Viszont a parancssor feldolgozásának megvan a maga sorrendje - ez egyrészt a balról-jobbra, ellenben vannak olyanok is, hogy mi történik meg előbb: egy változó kihelyettesítése, a joker-karakterek értelmezése, az átirányítás értelmezése, vagy a szóközök feldolgozása, stb.

Szerintem, amikor a $CMD helyettesítése megtörténik, akkor oldaná fel a speciális karaktereket is. Így, hogy azok magában a CMD-ben vannak, már literálisként kerülnek helyettesítésre. Ahhoz, hogy az interpreter a helyettesítést követően újra nekiálljon a string kiértékelésének, kell az eval.

a='echo hello'
$a

hello

a='echo hello >/dev/null'
$a

hello >/dev/null
eval "$a"

Persze, idézőjel nélkül leírva a változót, a helyettesítéskor a szóközök mentén szétesik paraméterekre a string, ezért működik valamennyire az a megoldás, amikor csak a változó nevét írjuk le. De a paraméterek már literálisok, újabb értelmezésre nem kerül sor.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE