Повторное использование одинаковых флагов для нескольких команд

Повторное использование одинаковых флагов для нескольких команд

Допустим, я хочу выполнить несколько команд с похожими флагами, например:

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

В первой строке необходимы кавычки, так как в ней есть пробелы.

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

Если в именах исключенных каталогов есть пробелы, их необходимо экранировать.

Связанный контент