Как сделать что-то в функции bash/zsh, а затем, в зависимости от вывода, сделать A или B?

В общем, плохая идея понизить список отдельных элементов до одной строки, независимо от того, является ли это списком параметров командной строки или списком путей.

Вместо этого используется массив:

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.

0
17.06.2021, 20:06
1 ответ

Вы можете сделать что-то вроде

local_changes=$(git status -s)
if [[ -n "$local_changes" ]]; then
    git reset --hard
fi

Я уверен, что есть более подходящая подкоманда git.

Но если вас вообще не волнуют локальные изменения, то делайте сброс безоговорочно.

git reset --hard
git pull
2
28.07.2021, 11:23

Теги

Похожие вопросы