定义别名并立即使用

Ole*_*nge 11 zsh alias

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 的习惯,我仍然把它们放在那里。


cuo*_*glm 9

你做不到。

因为别名是在历史扩展后才扩展的,并且一口气读完整行,所以当foo执行时,别名扩展过程就消失了,shell 识别新别名为时已晚。

您可以做的最好的方法是在.zshrc或使用jimmij 的答案之函数中定义别名或使用eval

alias foo=ls; eval foo
Run Code Online (Sandbox Code Playgroud)

zsh -c有一个特殊情况。在这种情况下,定义的别名.zshenv将被扩展。