在zsh这个工作正常:
alias foo=ls
foo
Run Code Online (Sandbox Code Playgroud)
但这不会:
alias foo=ls; foo
Run Code Online (Sandbox Code Playgroud)
以交互方式运行时,按 Enter 额外时间不是问题。但是跑ssh过去的时候突然就出问题了:
% ssh zsh@server 'alias foo=ls; foo'
zsh:1: command not found: foo
Run Code Online (Sandbox Code Playgroud)
即使使用换行符,它也不起作用:
% ssh zsh@server 'alias foo=ls;
foo'
zsh:2: command not found: foo
Run Code Online (Sandbox Code Playgroud)
奇怪的是,zsh知道它是别名:
% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence
Run Code Online (Sandbox Code Playgroud)
如何判断zsh别名应该是活动的?
jim*_*mij 10
这是一个众所周知的问题,甚至在zsh手册中的别名一章中都有描述(请参阅 参考资料man zshmisc)。处理它的推荐方法是使用函数而不是别名:
foo() { ls; } ; foo
Run Code Online (Sandbox Code Playgroud)
甚至在以下情况下更好ls:
foo() { ls -- "${@:-.}"; } ; foo
Run Code Online (Sandbox Code Playgroud)
附:函数定义(列表)末尾的分号和空格在 zsh 中是不需要的,但作为其他 shell 的习惯,我仍然把它们放在那里。
你做不到。
因为别名是在历史扩展后才扩展的,并且一口气读完整行,所以当foo执行时,别名扩展过程就消失了,shell 识别新别名为时已晚。
您可以做的最好的方法是在.zshrc或使用jimmij 的答案之类的函数中定义别名或使用eval:
alias foo=ls; eval foo
Run Code Online (Sandbox Code Playgroud)
zsh -c有一个特殊情况。在这种情况下,定义的别名.zshenv将被扩展。