Bash, grep - 캐럿이 포함된 명령이 서브셸에서 작동하지 않는 이유는 무엇입니까?

Bash, grep - 캐럿이 포함된 명령이 서브셸에서 작동하지 않는 이유는 무엇입니까?

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 ...

관련 정보