Bash 함수/별명 이름 충돌로 인해 세그먼트 오류 발생

Bash 함수/별명 이름 충돌로 인해 세그먼트 오류 발생

이 게시물의 문제는 나에게도 발생했습니다. mkdir이 bash와 충돌합니다.

평판이 없어서 거기에 댓글을 달 수 없었습니다. 왜 이런 일이 발생하는지 설명할 수 있는 사람이 있나요? 함수가 로드될 때가 아니라 런타임에 발생합니다. 다음은 동일한 문제의 붙여넣기입니다.

md() 
{  
    [ $# -eq 0 ] && { echo "$0 dirname [permissions]"; return; }
    [ -d "$1" ] && { echo "%1 already exists!"; return; }
    mkdir -m ${2:-0755} -p "$1"
}

"문제는 이전에 alias md="mkdir"과 같은 별칭이 있었기 때문에 bash가 새 bash 함수를 구문 분석할 때 md()를 mkdir()로 확장했고 함수가 무한 재귀적이 되어 쉘이 충돌했다는 것입니다."

이 문제가 적절하게 발견되었다고 생각했지만 그 이유를 이해하지 못합니다. 별칭 확장이 정규화된 쉘 기능의 방향을 잘못 지정하는 가능한 이유를 이해하지 못합니다. 거꾸로 그렇죠?

속여서 죄송합니다. 콜아웃 전에 이유를 읽어보세요.

답변1

md() { ... }"별칭은 실제로 텍스트 대체 매크로일 뿐입니다. 따라서 정의한 후 정의하려고 하면 md=mkdir실제로는 로 끝납니다 mkdir() { ... }. 함수 defs를 declare -p -f md및 로 인쇄해 declare -p -f mkdir보고 무슨 뜻인지 알아보세요." – 스틸드라이버

zi@zi-top:~$ declare -p -f nd
bash: declare: nd: not found
zi@zi-top:~$ declare -p -f mkdir
mkdir () 
{ 
    mkdir -p "$@"
}
zi@zi-top:~$ nd () {
        mkdir -p "$@"
}
zi@zi-top:~$ declare -p -f nd
bash: declare: nd: not found

Steeldriver가 말한 것이 사실이라는 것을 알았습니다. 코드에 텍스트 bashism wurl이라는 추론이 있을 가능성이 있는 이상한 아키텍처 결정이라고 생각합니다. 감사해요!

관련 정보