이것은 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