제가 하고 있는 학생 업무의 지루한 부분을 자동화하려고 합니다.
기본적으로 목표는 여러 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
그렇지 않을 수 없습니다 .git
RepoScan
호출 시 지정한 명령을 실행 하려면 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 연산자라고도 함)을 의미하기 때문에 이것이 필요합니다 .