별칭 정의 및 즉시 사용


11

에서 zsh이 작품 벌금 :

alias foo=ls
foo

그러나 이것은하지 않습니다 :

alias foo=ls; foo

대화식으로 실행할 때 추가 시간을 입력해도 문제가되지 않습니다. 그러나 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별칭이 활성화되어야한다고 어떻게 알 수 있습니까?


앨리어싱의 일반적인 문제입니다. 나는 사용하여 시도 bash하고 csh그들은 같은 방식으로 행동했습니다. 누군가가 그것을 설명 할 수 있기를 바랍니다.
Slyx

강타는 문제가되지 않습니다 : SSH 서버의 shopt 내부 -s expand_aliases, 별명 JJ = LS \ NJJ '
올레 단게

답변:


9

넌 못해.

별명은 히스토리 확장 후에 만 ​​확장되고 전체 행을 한 번에 읽었으므로 foo실행될 때 별명 확장 프로세스가 수행되지 않아 쉘이 새 별명을 인식하기에는 너무 늦습니다.

가장 좋은 방법은 jimmij의 답변.zshrc 과 같은 함수를 사용하거나 별칭을 정의 하거나 다음을 사용하는 것입니다 .eval

alias foo=ls; eval foo

있다 zsh을 -c와 특별한 경우 . 이 경우 정의 된 별칭이 .zshenv확장됩니다.


ssh host 'alias foo=bar<newline>foo'작동하지 않는지 설명 하지 못합니다. 특별한 사례가 있습니다zsh -c
Stéphane Chazelas

또는 사용alias foo=ls; eval foo
Stéphane Chazelas

@ StéphaneChazelas : 업데이트 된 정보에 감사드립니다. ssh사례에 대해 더 명확하게 말씀해 주시겠습니까? 나는 명령을 한 번에 읽은 것으로 생각합니다.
cuonglm

10

이것은 zshALIASING 장의 매뉴얼에 설명 된 매우 잘 알려진 문제입니다 (참조 man zshmisc). 권장되는 방법은 별명 대신 함수를 사용하는 것입니다.

foo() { ls; } ; foo

또는 더 나은 경우 ls:

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

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


1

명령 행에서 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.