定义别名并立即使用它

定义别名并立即使用它

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手册的“别名”一章中对此进行了描述(请参阅 参考资料man zshmisc)。处理它的推荐方法是使用函数而不是别名:

foo() { ls; } ; foo

或者在以下情况下更好ls

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

附注zsh 中不需要函数定义(列表)末尾的分号和空格,但作为其他 shell 的习惯,我仍然放置它们。

答案2

你不能做到。

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

您可以做的最好的方法是定义别名.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

相关内容