몇 가지 기본 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
답변1
r
이 경우를 예로 들면 ,
COMMAND="remote show origin"
이어서
git -C "$d" "$COMMAND"
git
3개의 인수 , -C
에 대한 값 d
및 remote show origin
예상되는 5개의 인수 대신 ( remote
및 show
가 origin
각각 대체됨 remote show origin
)을 확인합니다.
를 사용하면 bash
따옴표를 제거하기만 하면 문제가 해결됩니다.
git -C "$d" $COMMAND
Zsh를 사용하면 다음을 사용하여 문자열을 분할해야 합니다.
git -C "$d" $=COMMAND
답변2
해당 변수를 사용하여 COMMAND
문자열 목록을 저장하지만 이는 목록 변수가 아닌 문자열 변수입니다. 이 명령어는 , , 변수 값 및 변수 값 git -C "$d" "$COMMAND"
의 네 단어로 확장됩니다 . 예를 들어 값이 명령줄의 세 번째 인수 인 경우 git은 이를 이해하지 못합니다.git
-C
d
COMMAND
COMMAND
remote -v
git
remote -v
개별 매개변수를 전달하려면 문자열 목록에 저장하세요.대량으로. 쉘 프로그래밍에서 "배열"은 문자열 목록을 나타냅니다.
COMMAND=()
…
e) COMMAND=(remote -v);;
…
if ((${#COMMAND[@]} == 0)); then
echo >&2 "Missing command"
usage >&2
exit 2
fi
…
git -d "$d" "${COMMAND[@]}"