Следующая команда является правильной и достаточной, но вам необходимо полностью выйти из системы и повторно войти для работы.
usermod -a -G sudo user
Команда — это список аргументов, здесь вы хотите использовать массив для хранения этих аргументов:
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
).