Каков правильный способ расширения этих строк 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 

  • Требуется один лайнер: остановите httpd, если он уже запущен, и запустите httpd, если он не запущен
  • Как найти файл с использованием нескольких шаблонов
  • Если я выполнил файл сценария Bash, будут ли выполняться все команды внутри скрипта Bash как sudo?
  • Как скопировать файлы изображений, имена которых не заканчиваются размером их разрешения?
  • Shell Script: захватывать строку в середине текста, иногда в начале
  • Запустить скрипт из графического интерфейса с выходом терминала
  • Сценарий оболочки для удаления всех файлов, которые являются более старыми
  • Получить количество файлов в каждом каталоге
  • 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[@]}" 
    Linux и Unix - лучшая ОС в мире.