git add
특정 작업으로 인해 예상되는 수정 사항이 생성되었는지 확인하려고 하며 다음은 대화형 셸에서 작동합니다.
$ BASE_DIR=foo/bar/baz
$ git add "${BASE_DIR}"
$ git status --porcelain
M foo/bar/baz/a.txt
M foo/bar/baz/b.txt
$
$ git status --porcelain | grep "^M ${BASE_DIR}"
$ echo $?
0
대본으로 쓰고싶다
if $(git status --porcelain | grep "^M ${BASE_DIR}"); then
git commit -m "changes added"
git push
fi
그러나 명령을 하위 쉘로 이동하면 실패합니다.
$ if $(git status --porcelain | grep "^M ${BASE_DIR}"); then echo true; fi
M: command not found
서브쉘에 있는 캐럿의 특별한 점은 무엇입니까?
답변1
(질문을 작성하기 위해 모든 작업을 수행한 후 오류를 발견했기 때문에 게시되었습니다.)
문자열의 캐럿에는 특별한 것이 없습니다. 이 명령은 $(git status --porcelain | grep "^M ${BASE_DIR}")
주어진 테스트를 올바르게 실행하고 있으며포착서브셸의 출력입니다. 이것의 출력("M foo/bar/baz/a.txt"와 유사)은 다음과 같습니다.처형된인수로 제공되면 if
"M: 명령을 찾을 수 없습니다"라는 오류가 발생합니다 .
이 문제를 해결하려면 대괄호를 제거하고 출력을 삭제하세요. 반환 값은 파이프라인의 마지막 명령 값입니다.
if git status --porcelain | grep --quiet "^M ${BASE_DIR}"; then ...