在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