Невдалий, спрощений приклад:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Мені потрібно включити лапки так, ніби команда була такою:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Невдалий, спрощений приклад:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Мені потрібно включити лапки так, ніби команда була такою:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Відповіді:
Коротка відповідь: див. BashFAQ # 50 ("Я намагаюся поставити команду в змінну, але складні випадки завжди провалюються!").
Довга відповідь: Введення команд (або частин команд) у змінні, а потім повернення їх недоторканими є складним. Коли оболонка розширює змінну в командному рядку, якщо змінна була у подвійних лапках, вона не розбирається; якщо його не було в лапках, пробіли в ньому аналізуються на розриви аргументів, але лапки та втечі не розбираються. У будь-якому випадку розміщення лапок у значенні змінної нічого корисного не робить.
Зазвичай найкращим способом зробити подібний варіант є використання масиву замість простої текстової змінної:
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
Eval інший варіант:
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
Дивись також:
Я не бачу проблеми:
$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"
Можливо, вам потрібно ще раз цитувати значення:
$ rsync "$FLAGS" dir1 dir2
echoне показує, що ви думаєте, що це. Спробуйте printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"подивитися , чому ні один з цих варіантів роботи.