Bash 기능, 뭔가 이상한 일이 일어나고 있습니다!

Bash 기능, 뭔가 이상한 일이 일어나고 있습니다!

저는 bash 기능을 처음 접했지만 작업 속도를 높이기 위해 몇 가지 내용을 작성하기 시작했습니다. 나는 이것을 테스트하는 것을 좋아하기 때문에 내 ~/.profile을 자주 편집하고 가져오고 ~/.입력하기가 약간 어색하다는 것을 알게 됩니다 ...

그래서 제가 가장 먼저 할 일은 다음과 같습니다.

sourceProfile(){
    source ~/.profile
}

editProfile(){
    vim ~/.profile && sourceProfile
}

editProfile을 실행할 때 sourceProfile 호출에 문제가 있습니다. 처음에는 오류가 발생했습니다.

-bash: ~./profile: No such file or directory

내 기능에는 오타가 없습니다.

그러나 별칭을 사용하면 작동합니다.

alias sourceProfile='source ~/.profile'

그러나 해당 별칭을 추가한 다음 주석 처리하고 함수의 주석 처리를 제거한 후에 구문 오류가 발생하기 시작했습니다.

-bash: /home/jonathanramsden/.profile: line 45: syntax error near unexpected token `('
-bash: /home/jonathanramsden/.profile: line 45: `sourceProfile(){'

라인은 다음과 같습니다

alias sservice='sudo service'

내가 한 일은 댓글 달기/댓글 취소뿐이었다고 확신합니다! 내 인터넷 검색에 따르면 이것이 함수를 정의하는 구문인 것 같습니다.

답변1

별칭은 C의 전처리와 유사한 일종의 매크로 확장과 비슷 #define하지만 셸에서는 전처리 단계와 해석 단계 사이에 명확하게 보이는 경계가 없으며(또한 별칭은 모든 컨텍스트에서 확장되지 않음) 여러 가지가 있을 수 있습니다. 중첩된 별칭과 마찬가지로 별칭 확장 라운드).

이 작업을 수행할 때:

alias sourceProfile='source ~/.profile'
sourceProfile() {
  something
}

별칭 확장은 이를 다음과 같이 바꿉니다.

source ~/.profile() {
  something
}

구문 오류입니다. 그리고:

alias sourceProfile='source ~/.profile'
editProfile(){
  vim ~/.profile && sourceProfile
}

다음으로 변경하세요.

editProfile(){
  vim ~/.profile && source ~/.profile
}

sourceProfile따라서 나중에 함수로 다시 정의하면 정의에 원래 별칭의 확장된 값이 있으므로 editProfile호출되지 않습니다 .editProfile

또한 기능(또는 복합 명령)의 경우 별칭은 다음과 같은 경우에만 사용됩니다.기능 정의런타임이 아닌 시간(읽고 구문 분석할 때)입니다. 그래서 이거:

editProfile(){
  vim ~/.profile && sourceProfile
}
alias sourceProfile='source ~/.profile'
editProfile

sourceProfile함수 본문을 구문 분석할 때 정의되지 않았고 editProfile함수를 실행할 때 별칭 확장이 없기 때문에 작동하지 않습니다 editProfile.

따라서 별칭과 함수를 혼합하지 마십시오. 별칭 사용으로 인한 영향에 주의하세요. 별칭은 실제로 별칭이 아니기 때문입니다.주문하다오히려 그것은 일종의 거시적 확장의 형태이다.

답변2

테스트 함수를 개발할 때 source각 편집 사이에 함수 정의를 다시 로드()해야 합니다. 그렇지 않으면 이전 함수 정의가 계속 활성화됩니다. 함수에 오타가 없으며 해당 오류 메시지가 표시되어서는 안 됩니다(여기서는 재현할 수 없습니다). 이는 함수를 작성한 대로 실행하고 있지 않다는 의미입니다.

또한 스크립팅하는 동안 사용하는 것 $HOME보다 시작하는 것이 좋습니다 . 주로 변수처럼 동작하지 않기 때문입니다(참조~~큰따옴표 안에서 물결표(~)가 확장되지 않는 이유는 무엇입니까?).


제안:

edit_profile () {
    local EDITOR=${EDITOR:-vim}
    local file="$HOME/.profile"

    "$EDITOR" "$file" && source "$file"
}

변수 file는 추가이지만 EDITOR변수가 이미 적절한 편집기로 설정되었을 수 있습니다. 그렇지 않은 경우 코드는 이를 로 설정합니다 vim.

관련 정보