별칭을 정의하고 즉시 사용하세요.

별칭을 정의하고 즉시 사용하세요.

이것은 zsh훌륭하게 작동합니다:

alias foo=ls
foo

하지만 다음은 그렇지 않습니다.

alias foo=ls; foo

대화형으로 실행할 때 Enter를 누르면 추가 시간이 발생하는 것은 문제가 되지 않습니다. 그런데 실행할 때 ssh갑자기 문제가 발생했습니다 .

% ssh zsh@server 'alias foo=ls; foo'
zsh:1: command not found: foo

개행 문자를 사용해도 작동하지 않습니다.

% ssh zsh@server 'alias foo=ls;
foo'
zsh:2: command not found: foo

이상하게도 zsh별칭이라는 것을 알고 있습니다.

% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence

zsh별칭이 활성화되어야 하는지 어떻게 알 수 있나요 ?

답변1

이는 잘 알려진 문제이며 zsh매뉴얼의 "Alias" 장에도 설명되어 있습니다(참고자료 참조 man zshmisc). 이를 처리하는 권장 방법은 별칭 대신 함수를 사용하는 것입니다.

foo() { ls; } ; foo

또는 다음과 같은 경우에는 더 좋습니다 ls.

foo() { ls -- "${@:-.}"; } ; foo

추신. 함수 정의(목록) 끝에 있는 세미콜론과 공백은 zsh에서는 필요하지 않지만 다른 쉘에서는 여전히 습관적으로 사용합니다.

답변2

당신은 그것을 할 수 없습니다.

별칭은 기록 확장 후에 확장되고 전체 줄을 한 번에 읽기 때문에 foo실행하면 별칭 확장 프로세스가 사라지고 쉘이 새 별칭을 인식하기에는 너무 늦습니다.

당신이 할 수 있는 최선의 방법은 별칭을 정의하거나 .zshrc다음과 같은 함수를 사용하는 것입니다.지미의 대답또는 다음을 사용하십시오 eval.

alias foo=ls; eval foo

하나 있다zsh -c의 특수 사례. 이 경우 정의된 별칭이 .zshenv확장됩니다.

답변3

명령줄에서 c-shell(정확히는 tcsh) 사용:

mymachine % alias showme "echo here it is"
mymachine % showme
here it is

또는 .cshrc 파일에 넣고 파일을 가져옵니다.

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is

관련 정보