Оболочка добавляет одинарные кавычки к переменным, на которых происходит сбой rsync - PullRequest
0 голосов
/ 01 февраля 2012

Оболочка (/bin/bash) добавляет одинарные кавычки к переменным, считываемым из файла в цикле for, и приводит к сбою rsync.

У меня есть сценарий оболочки, выполняющий кучу rsync с. Входной файл выглядит так: /home/account/this подкаталог

Циклы for выглядят так:

IFS=$'\n'
for SOURCE_DEST in `cat file_list`
do
    rsync -av -e 'ssh -p 2222' account@domain.com:$SOURCE_DEST
done

Без IFS=$'\n' по умолчанию $SOURCE_DEST содержит только: /home/account/this вместо /home/account/this subdirectory.

Однако, когда я запускаю этот скрипт с IFS=$'\n', он ставит одинарные кавычки вокруг $SOURCE_DEST, например: 'account@domain.com:/home/account/this subdirectory', что приводит к сбою rsync и делает странные вещи.

Пример:

rsync --delete-after -av -e 'ssh -p 2222' 'account@domain.com:/home/account/this subdirectory'

что не получается, и мне нужно это без одинарных кавычек:

rsync --delete-after -av -e 'ssh -p 2222' account@domain.com:/home/account/this subdirectory

1 Ответ

1 голос
/ 01 февраля 2012

Я собираюсь предположить, что ни одно из имен не содержит пробелов, так как вы используете пробел в качестве разделителя, так как насчет чего-то вроде этого:

while read line
do
    line=($line) # split line on its spaces
    rsync -av -e 'ssh -p 2222' account@domain.com:${line[0]} ${line[1]}
done < file_list

Это читает ваш file_list строку за раз, разбивает его на пробел, а затем использует первое и второе "слово", которое было в качестве аргументов.

Как указал Johnsyweb, вы, возможно, имели в виду, что в каталоге действительно был пробел, и вы хотели передать его в rsync. В таком случае я бы сказал:

while read line
do
    rsync -av -e 'ssh -p 2222' "account@domain.com:${line// /\ }"
done < file_list

Это должно привести к тому, что все пробелы будут убраны, что, я думаю, может быть тем, чего вам не хватало раньше.

...