Переменная не раскрывается в команде с diff

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

usermod -a -G sudo user
1
07.12.2019, 09:37
1 ответ

Команда — это список аргументов, здесь вы хотите использовать массив для хранения этих аргументов:

ignore_files=(
    local
    '*.local.*'
   .bundle
    Gemfile.lock
)
ignore_command=()
for f in "${ignore_files[@]}"; do
    ignore_command+=(-x "$f")
done
print -r -- "${(q+)ignore_command[@]}"
sudo diff -ruNd  "${ignore_command[@]}" <path a> <path-b> 

Вероятно, вас смущает поведение Bourne -, например оболочки, в которой оставление расширения параметра без кавычек является оператором split+glob, поэтому он превращает строковую/скалярную переменную в список (или файлы, соответствующие шаблонам)при расширении .

Это неправильное поведение было исправлено zshи большинством других современных оболочек, таких как rc, es, fish.

Вы могли бы эмулировать такое поведение оболочек Борна с помощью set -o shwordsplit -o globsubst, но это было бы движением назад. В частности, globsubstбудет проблемой в вашем случае, поскольку *.local.*содержит символы глобуса.

В zshесли вы хотите разделить переменную или выполнить подстановку при ее расширении, вы должны указать это явно:

  • $=var, разбивает $varна $IFSсимволов.
  • ${(s:,:)var}разбивается на определенные строки (здесь,)
  • $~var:выполняет подстановку (или сопоставление с образцом в зависимости от контекста )при расширении (, например, если $varсодержит *, $~varв контексте списка будет расширяться до списка файлов в текущем каталоге как оболочка Борна$var)
  • $=~var:выполняет как разбиение, так и подстановку, так что это похоже на $varоболочки Борна.

В этом конкретном случае вы также можете:

sudo diff -ruNd  --exclude=$^ignore_files <path a> <path-b>

(, где ^заставляет массив расширяться, как в fishили rcкак --exclude=element1--exclude=element2... Это фактически включает опцию rcexpandparamдля этого расширения, например ~, включает globsubstи=shwordsplit).

4
27.01.2020, 23:17

Теги

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