
Допустим, я хочу выполнить несколько команд с похожими флагами, например:
du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
Я хочу повторно использовать последовательность --exclude
флагов и сделать код более чистым, например, сохранив эти флаги в переменной.
Итак, вышеприведенные команды выглядят так:
du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
Обратите внимание, что tar
исключаются файлы и каталоги, относящиеся к указанному каталогу.
Какое решение является самым лучшим и чистым?
Фон
Я хочу сделать резервную копию своей системы с помощью tar и исключить некоторые каталоги, которые мне не нужны.
решение1
Вы можете попробовать это:
$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
Здесь мы используем bash
расширение истории:
!!
обратитесь к последней команде3-$
обратитесь к 3-му параметру до последнего
Вам следует включить bash
в своем скрипте функции расширения истории, которые отключены в неинтерактивной оболочке:
set -o history
set -o histexpand
решение2
В Bash очень простой способ — использовать массивы:
myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"
Они могут переносить пробелы и любые другие забавные символы:
myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"
Их тоже можно подделать, например, вы хотите исключить все подкаталоги каталога /this/one
, содержащие букву g
:
exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"
решение3
Я бы добавил это в качестве комментария, но я не понял, как правильно форматировать комментарии!
В любом случае, я думаю, что вы уже на 90% пути к цели. Попробуйте:-
EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS
В первой строке необходимы кавычки, так как в ней есть пробелы.
При использовании переменной не используйте кавычки, чтобы разделить аргументы пробелами.
Если в именах исключенных каталогов есть пробелы, их необходимо экранировать.