Каков правильный способ расширения этих строк bash в правильные команды Git?

Я собираюсь писать некоторые базовые сценарии bash, и расширение этих строк в команды Git оказывается проблематичным.

Идея заключается в том, чтобы передать сценарию каталог верхнего уровня, чьи подкаталоги содержат репозитории Git и выполняют ту же самую команду в подкаталогах с возможностью tee вывода в файл.

Проблема в том, что команды git, которые имеют дополнительные опции, работают некорректно. Поэтому работают команды diff и status . remote работы, но remote show origin не работает. Например, параметры r и e не работают.

 processing /home/vfclists/project1/ git: 'remote -v' is not a git command. See 'git --help'. processing /home/vfclists/project1/ git: 'remote show origin' is not a git command. See 'git --help'. 

Проблема возникает из расширения bash или от самого Git или того и другого?

 #!/bin/bash usage() { cat << EOF checkrepos command output file usage: $0 options OPTIONS: commands r remote show origin d diff s status e remote other options -d directory -t filename for tee EOF } WD=$(pwd) echo "working directory $WD" while getopts "c:t:v:h:" OPTION do case $OPTION in c) case $OPTARG in r) COMMAND="remote show origin" ;; d) COMMAND="diff" ;; s) COMMAND="status" ;; e) COMMAND="remote -v" ;; esac ;; t) OUTPUTFILE=$OPTARG ;; v) VERBOSE=1 ;; h) usage exit 1 ;; ?) usage exit ;; esac done if [[ -z $COMMAND ]] then echo 'command is required' usage exit 1 fi for d in $WD/* ; do echo "" echo "====================" echo "" echo "processing $d" git -C "$d" "$COMMAND" echo "" echo "====================" echo "" done 

2 Solutions collect form web for “Каков правильный способ расширения этих строк bash в правильные команды Git?”

В качестве примера r случай r

 COMMAND="remote show origin" 

с последующим

 git -C "$d" "$COMMAND" 

git видит три аргумента, -C , значение d и remote show origin , а не пять, которые он ожидает ( remote , show и origin отдельно, а не remote show origin ).

С помощью bash простое удаление цитат исправит это:

 git -C "$d" $COMMAND 

С Zsh вам нужно разбить строку, используя

 git -C "$d" $=COMMAND 

(спасибо ilkkachu и Жиль !).

Вы используете переменную COMMAND для хранения списка строк, но это строковая переменная, а не переменная списка. Инструкция git -C "$d" "$COMMAND" расширяется до четырех слов: git , -C , значение переменной d и значение переменной COMMAND . Если значение COMMAND , например, remote -v то третий аргумент в командной строке git является remote -v , который git не понимает.

Чтобы передать отдельные аргументы, сохраните их в списке строк, т. Е. Массиве . «Массив» в программировании оболочки означает список строк.

 COMMAND=() … e) COMMAND=(remote -v);; … if ((${#COMMAND[@]} == 0)); then echo >&2 "Missing command" usage >&2 exit 2 fi … git -d "$d" "${COMMAND[@]}" 
  • Выполнение задания Cron, но не создание туннеля
  • Простой сценарий bash для резервного копирования и удаления каталогов
  • Сценарий слияния слов
  • Запустить фоновый процесс из sh и закрыть терминал
  • Как заменить токены из одного файла данными из другого?
  • Поиск рекурсивно большого файла
  • Как очистить или перезаписать ОЗУ и выключить компьютер по сценарию bash, который реагирует на сочетание клавиш?
  • Извлечь определенный текст из переменной в сценарии оболочки
  • Правила UDEV Interfere
  • Объединение частичных дубликатов
  • perl + сочетание команды exec с perl одной линейной строкой
  • Interesting Posts

    Как сохранить регулярное выражение в переменной оболочки, избегая проблем с цитированием символов, которые являются особыми для оболочки?

    извлечь значение между двумя шаблонами поиска на одной строке

    Как я могу заполнить массив в цикле сценариев оболочки Bash

    Добавление пользователя в группу по умолчанию

    Жареный зола PS1 не расширяется

    замена специальных символов с помощью команды sed

    Какая информация о процессе может быть восстановлена ​​после его завершения?

    mod_mono на SLES 12.1 не может зашифровать ASP.Net web.config

    Что такое привязка?

    Восстановите файлы внутри папки, которая была заменена пустой. (openSUSE, Ext4)

    Bash переименовывает 360 000 файлов с помощью find -exec

    Выйти из команды Gnome

    Как эффективно выражать переменные для SED?

    Остановить Linux от использования swap

    Выполнить команду в фоновом режиме, но также объединить в нее другие команды?

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