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

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

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 и исключить некоторые каталоги, которые мне не нужны.

  • BASH: передать аргументы в подзапись
  • Как я могу найти все самоопределенные переменные и функции для отмены?
  • Переменные доступа, установленные внутри подстановок
  • Маркировка команды в качестве переменной для повторного использования внутри каналов или отдельных команд
  • Где хранятся переменные оболочки?
  • Сериализовать переменную оболочки в bash или zsh
  • Где моя синтаксическая ошибка синтаксиса .sh?
  • Возьмите входные аргументы и передайте их на сегодняшний день
  • 3 Solutions collect form web for “Повторное использование похожих флагов для нескольких команд”

    Вы можете попробовать следующее:

     $ 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-$ ссылаются на третий параметр до последнего

    Вы должны включить функции расширения истории bash в вашем скрипте, которые отключены в неинтерактивной оболочке:

     set -o history set -o histexpand 

    В 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[@]}" 

    Я бы добавил это как комментарий, за исключением того, что я не понял, как правильно форматировать комментарии!

    Во всяком случае, я считаю, что вы на 90%. Пытаться:-

     EFLAGS="--exclude=/dir1 --exclude=/dir2" du -sh / $EFLAGS tar cvf archive / $EFLAGS 

    Котировки нужны в первой строке, так как есть пробелы.

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

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

    Linux и Unix - лучшая ОС в мире.