zsh에서 함수를 작성하는 올바른 방법

zsh에서 함수를 작성하는 올바른 방법

git add --all; git commit -m "some commit message"; git push프로젝트 작업을 할 때 최신 작업을 원격 저장소에 푸시하기 위해 이러한 명령을 순차적으로 실행해야 하는 경우가 많습니다 .

.zshrc저는 이 세 가지 명령을 캡슐화하는 함수를 작성하여 셸을 시작할 때마다 사용할 수 있도록 파일 에 저장하는 것이 가장 좋겠다고 생각했습니다 . 그래서 다음 함수를 작성했습니다.

gp() {
    git add --all
    git commit -m "$*"
    git push
}

export -f gp

파일을 얻 .zshrc거나 새로운 쉘 세션을 시작할 때. 다음 오류가 발생합니다.

parse error near `()'

함수 정의에 대한 올바른 구문을 온라인에서 확인했는데 위의 함수가 나에게 맞는 것 같습니다. 이 오류를 해결하는 방법을 모르겠습니다. 도움을 주시면 정말 감사하겠습니다.

답변1

function-name() command

은 1980년대 초반 Bourne 쉘에서 지원되는 여러 함수 정의 구문 중 하나이므로 zsh코드의 이 부분은 괜찮습니다.

오류가 발생하는 경우 parse error near `()'파서가 애초에 함수 정의를 요구하지 않기 때문일 가능성이 높습니다.

예를 들어, 다음과 같은 오류가 발생합니다.

case x in
gp() {
  body
}

after와 마찬가지로 zsh에는 함수 정의가 아닌 case x in케이스 패턴 또는 이 필요합니다 .esac

따라서 문제는 표시하지 않은 zshrc 부분 어딘가에 있을 수 있습니다. Microsoft Windows 시스템에서 스크립트를 편집할 때와 같이 스크립트가 MSDOS 줄 끝(LF 대신 CRLF)으로 포맷된 경우에도 구문 오류가 자주 발생합니다. dos2unix이러한 문제를 해결하는 데 사용할 수 있습니다.

그렇지 않은 경우 이는 export -f function-namebash 전용 기능입니다.

zsh에 전달할 수는 있지만 이 위험한 함수에 해당하는 함수는 없습니다 ~/.zshenv.

"$*"이것은 또한 sh당신이 할 일입니다 / bash왜냐하면 그들은 그것을 하는 더 좋은 방법이 없기 때문입니다. 이는 $IFS당시의 내용이 무엇이든 위치 인수를 의 첫 번째 문자와 연결합니다 . 에서는 zsh주사위 굴림에 그대로 두는 대신 매개변수 확장 플래그와 연결할 때 사용할 구분 기호를 명시적으로 지정할 수 있습니다 j. ${(j[ ])@}예를 들어 위치 매개변수를 공백과 연결합니다.

관련 정보