2014-08-27 1 views
2

zsh에서 함수 내에서 별칭을 정의한 다음 사용하려고했습니다. 작동하지 않습니다. 왜이 세상에서? 주변을 둘러 볼 수 있습니까?새로 정의 된 별칭이 함수 (zsh) 내에서 작동하지 않습니다.

% cat > test 
alias_problem() { 
    alias hithere="echo Hi there!" 
    hithere 
} 
^D 
% source test 
% alias_problem 
alias_problem:2: command not found: hithere 
% hithere 
Hi there! 
% wtf? 
zsh: no matches found: wtf? 

이상적으로, Hi there! 사람이 무슨 일이 일어나고 있는지 설명 할 수 인쇄 할 alias_problem를 실행? 그리고 주위를 둘러 볼 방법이 있습니까?

배경 : 몇 가지 별칭을 만든 다음 그 중 하나를 실행하는 기능을 만들고 싶습니다. 예 :

myfuncA() { 
    alias alias1=... 
    alias alias2=... 
    alias1 
} 

등의 명령을 사용하여 몇 가지 명령으로 환경을 설정할 수 있습니다. 별칭을 다른 세트로 토글하는 두 번째 기능이 있습니다.

방금 ​​함수를 사용해야합니까? 어쨌든 zsh에서 함수에 대한 별명을 사용하는 이유가 있습니까? 앞으로 일어날 일을 피하고 어떻게 피하는지를 알고 싶습니다.

감사합니다 :)

--Peter

답변

1

이 앨리어싱에서 man zshmisc에서 언급 한 :

: 하여 다음 코드를 설명 별칭에 일반적으로 발생하는 문제가

입니다

  alias echobar=’echo bar’; echobar 

이렇게하면 mand echobar를 찾을 수 없습니다. 이는 코드가 인 경우 별칭이 확장되기 때문에 발생합니다. 한 번에 전체 행을 읽으므로 은 echobar가 실행될 때 새로 정의 된 별칭을 확장하기에는 너무 늦습니다. 이것은 쉘 스크립트, 함수 및 'source'또는 '.'로 실행되는 코드에서 종종 문제가됩니다. 따라서 비대화 형 코드에서는 별칭이 아닌 함수를 사용하는 것이 좋습니다.

나는 문제가 따옴표에서 발생하는 것과 같은 상황이 이상 적용되도록 함수의 몸이, (암시 적 alias hithere="..."; hithere)을 한 줄로 저장 있다는 것을 생각 .

+0

그래서 당신 (그리고 zshmisc)은 echobar가 이미 정의 되었다면'ls; 에코 바르; ls'는'ls '로 확장됩니다; 에코 바; ls' 그리고 나서 실행 되었습니까? 나는 그것을 놓쳤다. 감사. –

+0

오른쪽. 함수가 정의 될 때 코드가 읽히므로 별칭은 함수 호출 다음에 읽혀지는 코드에 대해 정의되지만 함수가 * 호출 될 때 별칭 확장을 거치지 않습니다. 다음과 같이 좀 더 명확하게 보입니다 :'foo() {bar; }', 별명'alias bar = "echo foo"'를 정의하십시오. 'foo'를 호출하면 함수를 호출 할 때 함수 본문에 별칭 확장이 수행되지 않으므로 명령에 오류가 없음을 생성합니다. – chepner

관련 문제