定义别名并立即使用


11

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别名应处于活动状态?


这是别名的常见问题。我尝试使用bashcsh并且它们的行为方式相同。我希望有人能解释一下。
Slyx

击不是问题:SSH服务器'禁用了javascript -s expand_aliases;别名JJ = LS \ NJJ'
奥莱丹下

Answers:


9

你做不了。

因为别名仅在历史记录扩展后才扩展,并且一次读取了整行,所以当foo执行别名扩展过程时,外壳识别新别名为时已晚。

最好的方法是定义别名.zshrc或使用jimmij的答案之函数或使用eval

alias foo=ls; eval foo

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


那不能解释为什么ssh host 'alias foo=bar<newline>foo'不起作用。有一个特殊的案例zsh -c
斯特凡Chazelas

或者使用alias foo=ls; eval foo
斯特凡Chazelas

@StéphaneChazelas:感谢您提供的信息,并对其进行了更新。关于ssh情况,请您说清楚点。我认为该命令仍然是一次性读取的。
cuonglm

10

这是一个众所周知的问题,甚至在zsh手册中的“ 别名”一章中对此进行了描述(请参阅参考资料man zshmisc)。建议使用的方法是使用函数而不是别名:

foo() { ls; } ; foo

甚至在以下情况下更好ls

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

ps。在zsh中不需要在函数定义(列表)和空格末尾使用分号,但作为其他shell的习惯,我仍然将它们放在了后面。


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.