이러한 bash 문자열을 올바른 Git 명령으로 확장하는 올바른 방법은 무엇입니까?

이러한 bash 문자열을 올바른 Git 명령으로 확장하는 올바른 방법은 무엇입니까?

몇 가지 기본 bash 스크립트를 작성하려고 하는데 이러한 문자열을 Git명령으로 확장하는 데 문제가 있는 것으로 나타났습니다.

아이디어는 하위 디렉터리에 Git 저장소가 포함된 최상위 디렉터리에 스크립트를 전달하고 하위 디렉터리에서 동일한 명령을 실행하여 선택적으로 tee출력을 파일로 출력하는 것입니다.

문제는 추가 옵션이 포함된 git 명령이 제대로 작동하지 않는다는 것입니다. 그래서 명령이 작동합니다 diff. 작동하지만 작동하지 않습니다. 예 를 들어 옵션이 작동하지 않습니다.statusremoteremote show originre

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

답변1

r이 경우를 예로 들면 ,

COMMAND="remote show origin"

이어서

git -C "$d" "$COMMAND"

git3개의 인수 , -C에 대한 값 dremote show origin예상되는 5개의 인수 대신 ( remoteshoworigin각각 대체됨 remote show origin)을 확인합니다.

를 사용하면 bash따옴표를 제거하기만 하면 문제가 해결됩니다.

git -C "$d" $COMMAND

Zsh를 사용하면 다음을 사용하여 문자열을 분할해야 합니다.

git -C "$d" $=COMMAND

(감사해요이르카초그리고자일스! ).

답변2

해당 변수를 사용하여 COMMAND문자열 목록을 저장하지만 이는 목록 변수가 아닌 문자열 변수입니다. 이 명령어는 , , 변수 값 및 변수 값 git -C "$d" "$COMMAND"의 네 단어로 확장됩니다 . 예를 들어 값이 명령줄의 세 번째 인수 인 경우 git은 이를 이해하지 못합니다.git-CdCOMMANDCOMMANDremote -vgitremote -v

개별 매개변수를 전달하려면 문자열 목록에 저장하세요.대량으로. 쉘 프로그래밍에서 "배열"은 문자열 목록을 나타냅니다.

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

관련 정보