git 명령을 인수로 전달

git 명령을 인수로 전달

제가 하고 있는 학생 업무의 지루한 부분을 자동화하려고 합니다.

기본적으로 목표는 여러 git 저장소(내가 이미 직장에 가지고 있는)를 복제한 다음 모든 저장소에 대해 동일한 git 체크아웃을 실행하는 것입니다. 매번 다음과 같은 메시지를 받습니다.

`git rev-list -n 1 --before="2016-04-29 23:59" master`

git checkout에 제공됩니다. 나는 모든 것을 내 스크립트에 전달하여 체크아웃을 수행할 수 있도록 하고 싶습니다. 현재 내 스크립트는

#!/bin/bash

echo $1

(처음에는 더 복잡했지만 나중에 이 입력에 집중할 수 있도록 다른 모든 것을 주석 처리했습니다.)

스크립트를 실행하려고 하면 다음과 같습니다.

./RepoScan `git rev-list -n 1 --before="2016-04-29 23:59" master`

다음 오류가 발생합니다.

fatal: Not a git repository (or any of the parent directories): .git

그 다음에는 개행 문자가 옵니다. 나는 이것이 git rev-list가 RepoScan에 전달되는 대신 실행을 시도하고 있음을 의미한다고 생각합니다. 인수로 전달될 때 실행되지 않지만 스크립트에 의해 계속 실행될 수 있도록 이를 패키지화하는 방법이 있습니까?

(또한 중요한 경우 OSX를 사용하고 있습니다.)

답변1

백틱으로 구분됨명령 대체: 백틱 내에서 명령을 실행하고 해당 출력을 명령줄에 삽입합니다. (백틱이 큰따옴표 안에 없으면 더 복잡해집니다. 자세한 내용은 나중에 설명하겠습니다.) 따라서 git rev-list …실행되기 전에 현재 디렉터리에서 실행됩니다. 명령의 출력이 에 인수로 전달되므로 RepoScan그렇지 않을 수 없습니다 .gitRepoScan

호출 시 지정한 명령을 실행 하려면 RepoScan다음을 통과해야 합니다.명령RepoScan해당 명령의 출력이 아닌 명령줄에 표시됩니다 . 명령의 의미에 따라 이를 수행하는 방법에는 두 가지가 있습니다.

매개변수가 포함된 실행 파일 전달

명령을 일부 매개변수가 있는 실행 파일로 해석하려면 명령을 다음과 같이 전달하십시오.단어 목록.

./RepoScan git rev-list -n 1 --before="2016-04-29 23:59" master

RepoScan스크립트 에서는 "$@"를 사용하여 명령을 참조하십시오. 이 @기호는 매개변수 목록을 나타내는 특수 변수입니다. 큰따옴표 안에 사용할 때 특별한 동작이 있습니다. 각 인수는 별도의 단어에 배치됩니다 "$@".목록논쟁.

명령이 다른 옵션을 사용하는 경우 RepoScan해당 옵션을 모두 명령 앞에 전달해야 합니다. shift내장 함수를 사용하여 명령줄 시작 부분에서 처리된 옵션을 제거합니다. 당신은 일반적으로 사용합니다getopts내장된 구문 분석 옵션.

쉘 조각 전달

또 다른 가능성은 쉘 조각을 단일 인수로 전달하는 것입니다.

./RepoScan 'git rev-list -n 1 --before="2016-04-29 23:59" master'

이 참조의 두 가지 수준에 유의하십시오. 작은따옴표는 호출하는 셸에 사용됩니다 RepoScan. 작은따옴표 안의 모든 내용은 문자 그대로 해석되므로 RepoScan문자열인 하나의 인수를 얻습니다 git rev-list -n 1 --before="2016-04-29 23:59" master. 내부에는 RepoScan쉘 조각이 있으므로 다음을 사용하십시오.

eval "$1"

조각이 첫 번째 인수에 있는 경우 또는

eval "$command"

코드 조각이 변수에 있는 경우 command.

변수 확장 주위의 큰따옴표에 유의하세요.. $foo외부 큰따옴표는 "값 foo"을 의미하는 것이 아니라 "값을 가져와 패턴 목록 foo에 따라 분할 IFS하고 결과를 glob으로 해석"(split+glob 연산자라고도 함)을 의미하기 때문에 이것이 필요합니다 .

관련 정보