Переменные параметры фильтра rsync

Otra herramienta de consulta de DNS, dig, es muy detallada de forma predeterminada, pero si la usa como dig +short, obtiene solo las respuestas, una por línea:

$ dig +short unix.stackexchange.com
151.101.65.69
151.101.193.69
151.101.129.69
151.101.1.69

$ dig +short www.latimes.com
32975.edgekey.net.
e11929.e12.akamaiedge.net.
2.22.63.16
2.22.63.11

Si el dominio solicitado no existe, simplemente no devuelve nada:

$ dig +short gbnjk.com
$
0
22.06.2019, 19:29
1 ответ

В вашем коде есть две проблемы.

  1. Расширение $COMPILE_FILTERSне заключено в кавычки. Это означает, что его значение --filter="- js/editor/editorjs/*"по умолчанию будет разбито на слова по пробелу (). Это слова --filter="-и js/editor/editorjs/*". Затем слова будут подвергаться генерации имени файла (подстановке ), но в вашем случае это будет проблемой, только если у вас где-то есть файл, соответствующий шаблону js/editor/editorjs/*".

    Разделение на два слова означает, что rsyncполучит два аргумента , и не сможет правильно использовать первый из них (это то, на что ссылается ваше сообщение об ошибке ).

    Вы решаете эту проблему, заключая расширение переменной в двойные кавычки.

  2. Строка, которую вы сохраняете в переменной , включает двойные кавычки. Если вы двойные кавычки расширяете переменную, вы в основном указываете rsyncиспользовать фильтр"- js/editor/editorjs/*"(с двойными кавычками и всем ). Это потому, что вы используете одинарные кавычки вокруг строки.

    Вы решаете эту проблему, назначая правильную строку переменной:

    COMPILE_FILTERS=--filter="- js/editor/editorjs/*"
    

    или

    COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
    

Конечный результат:

COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
rsync -a "$COMPILE_FILTERS" \
  --filter="- *node_modules*" \
  --filter="-.git*" \
  --filter="- /**/.git*" \
  "$src" "$dest"

Обратите внимание, что я также процитировал другие переменные, задействованные в коде.

См. также:


Если вы позже решите включить дополнительные фильтры в свою переменную, обязательно переключитесь на массив (в оболочке, которая их поддерживает):

filters=(
    --filter="- js/editor/editorjs/*"
    --filter="- *node_modules*"
    --filter="-.git*"
    --filter="- /**/.git*"
)

rsync --archive "${filters[@]}" "$src" "$dest"

В оболочке, которая не имеет именованных переменных массива (/bin/sh, dash), вы можете набирать меньше:

set -- \
    --filter="- js/editor/editorjs/*" \
    --filter="- *node_modules*" \
    --filter="-.git*" \
    --filter="- /**/.git*"

rsync --archive "$@" "$src" "$dest"

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

0
28.01.2020, 03:32

Теги

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