В общем, плохая идея понизить список отдельных элементов до одной строки, независимо от того, является ли это списком параметров командной строки или списком путей.
Вместо этого используется массив:
rsync_options=( -rnv --exclude='.*' )
или
rsync_options=( -r -n -v --exclude='.*' )
и позже...
rsync "${rsync_options[@]}" source/ target
Таким образом, цитирование отдельных опций сохраняется (до тех пор, пока вы двойные кавычки расширяете${rsync_options[@]}
). Это также позволяет вам легко манипулировать отдельными элементами массива, если вам это нужно, перед вызовом rsync
.
В любой оболочке POSIX для этого можно использовать список позиционных параметров:
set -- -rnv --exclude='.*'
rsync "$@" source/ target
Опять же, двойное цитирование расширения $@
здесь имеет решающее значение.
Тангенциально связанные:
Проблема в том, что когда вы помещаете два набора параметров в строку, одинарные кавычки значения параметра --exclude
становятся частью этого значения. Следовательно,
RSYNC_OPTIONS='-rnv --exclude=.*'
сработало бы¹... но лучше (, как и в более безопасном ), использовать массив или позиционные параметры с отдельными кавычками. Это также позволит вам использовать вещи с пробелами в них, если вам это нужно, и позволит избежать того, чтобы оболочка выполняла генерацию имени файла (подстановку )для параметров.
¹ при условии, что $IFS
не изменен и в текущем каталоге нет файла, имя которого начинается с --exclude=.
, и не установлены параметры оболочки nullglob
или failglob
.
Вы можете сделать что-то вроде
local_changes=$(git status -s)
if [[ -n "$local_changes" ]]; then
git reset --hard
fi
Я уверен, что есть более подходящая подкоманда git.
Но если вас вообще не волнуют локальные изменения, то делайте сброс безоговорочно.
git reset --hard
git pull