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

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

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

  • Баш-переменные - любые трюки с экстрактами, основанные на заказе?
  • Как сохранить новые строки, исходящие из вывода команды во время присвоения переменной?
  • Как я могу найти все самоопределенные переменные и функции для отмены?
  • Когда нужно экспортировать переменную?
  • предотвратить перехват ловушки от переменной подчеркивания $ _
  • Выполнение команды внутри переменной не работает для sed
  • Установка переменной оболочки с нулевым коалесцированием
  • Создание нового файла внутри awk, но в другом каталоге на основе значения поля ввода
  • 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 

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

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

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

    Interesting Posts

    Что такое ELF Magic?

    Почему существует верхний предел для завершения вкладки «отображать все возможности 3197»?

    Как очередь сообщений реализована в ядре Linux?

    Почему этот результат BSD grep отличается от GNU grep?

    Как указать альтернативную корневую файловую систему во время загрузки

    awk, как изменить значение файла с помощью наборов параметров?

    Проблема с исполнением Firefox версии 9.0.1

    Не могу пинговать машину на eth0; Пункты штрафа на wlan0; Centos 6.5 на Dell D610

    Устройство отключения звука Pulseaudio

    Почему мой сенсорный экран не реагирует на изменение основного монитора на внешнем мониторе без касания?

    debhelper и забавный вопрос о dh_make

    Удалить каталог в ftp

    Как переименовать несколько файлов в одной команде или скрипте в Unix?

    различия между -resize и -size, а также между -repage и -page для преобразования?

    Как определить варианты, с которыми ядро ​​Linux строилось?

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