Qual é o caminho certo para expandir essas strings bash para os comandos Git corretos?

0

Estou tentando criar alguns scripts bash básicos e a expansão dessas strings em comandos Git está se mostrando problemática.

A idéia é passar ao script um diretório de nível superior cujos subdiretórios contenham repositórios Git e executar o mesmo comando nos subdiretórios com a opção de tee ing a saída para um arquivo.

O problema é que os comandos do git que possuem opções extras não funcionam corretamente. Portanto, os comandos diff e status funcionam. remote funciona, mas remote show origin não funciona. Por exemplo, as opções r e e não funcionam.

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'.

O problema vem da expansão bash ou do próprio Git , ou de ambos?

#!/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
    
por vfclists 16.10.2016 / 23:28

2 respostas

1

Tomando o caso r como exemplo, com

COMMAND="remote show origin"

seguido por

git -C "$d" "$COMMAND"

git vê três argumentos, -C , o valor de d e remote show origin , em vez dos cinco esperados ( remote , show e origin separadamente, em vez de remote show origin ).

Com bash , basta remover as aspas para corrigir isso:

git -C "$d" $COMMAND

Com o Zsh, você precisa dividir a string usando

git -C "$d" $=COMMAND

(obrigado ilkkachu e Gilles !).

    
por 16.10.2016 / 23:37
1

Você está usando a variável COMMAND para armazenar uma lista de strings, mas é uma variável de string, não uma variável de lista. A instrução git -C "$d" "$COMMAND" expande para quatro palavras: git , -C , o valor da variável d e o valor da variável COMMAND . Se o valor de COMMAND for, e. remote -v , em seguida, o terceiro argumento na linha de comando de git é remote -v , que o git não entende.

Para passar argumentos separados, armazene-os em uma lista de strings, ou seja, um array . "Array" na programação shell significa uma lista de strings.

COMMAND=()
…
  e) COMMAND=(remote -v);;
…
if ((${#COMMAND[@]} == 0)); then
  echo >&2 "Missing command"
  usage >&2
  exit 2
fi
…
git -d "$d" "${COMMAND[@]}"
    
por 17.10.2016 / 00:57