Это вопрос старшинства. Расширения скобок оцениваются перед переменной:
$ foo="10"
$ echo {1.."$foo"}
{1..10}
Или, более подробно:
$ set -x
$ echo {1.."$foo"}
+ echo '{1..10}'
{1..10}
Это документировано в man bash
:
Порядок расширений следующий: расширение скобок; расширение тильды, расширение параметров и переменных, арифметическое расширение, и команда подстановка (выполняется слева направо); разбиение слов; и расширение имени пути.
Другими словами, когда вы попытаетесь использовать {1..$foo}
, первое, что сделает bash, это попытается оценить расширение скобки. В этот момент переменная еще не заменена своим значением, она просто $foo
. Поэтому то, что видит bash, эквивалентно {1..SOMESTRING}
:
$ echo {1..SOMESTRING}
{1..SOMESTRING}
Поскольку это вопрос порядка, в котором оболочка выполняет определенные операции, обходного пути нет. Вы просто не можете использовать переменные таким образом в расширении скобок. Вам придется найти другой способ сделать это. Например, используйте seq
:
for i in $(seq 1 "$REPEAT"); do
echo "${MESSAGE}"
done
Or:
for((i=0;i<=$REPEAT;i++)); do
echo "${MESSAGE}"
done
Не волнуйтесь, у вас все отлично получается с rsync -S
.
Причина, по которой cp
намного быстрее, заключается в том, что он на самом деле не копировал его. У этого может быть много причин, первые две, которые я могу придумать, это:
Система решила, что файловая система не нуждается в немедленной синхронизации, а копирование произойдет позже в фоновом режиме (или сразу при запускеsync
). См. man sync
для получения дополнительной информации.
У вас есть файловая система с функциями типа cow/dedup -. В результате cp
создаст то, что я бы назвал «замаскированной жесткой ссылкой». В этом случае копия никогда не будет сделана физически, данные в файле просто получат дополнительное имя (как настоящая жесткая ссылка ). Но (в отличие от реальных жестких ссылок ), когда исходный и конечный файл получают разные изменения, в будущем эти изменения будут сохранены физически в разных местах, и файловая система привяжет изменения к правильному файлу. Ознакомьтесь с любыми документами о копировании -на -записи и дедупликации данных (, например. страницы Википедии )для получения дополнительной информации.