zsh中的别名和bash中的别名之间的区别


9

我到处搜寻,但找不到任何结论。zsh中的alias命令和bash中的alias命令之间有区别吗?如果不是,这是否意味着我可以在两个shell之间共享一组别名,并期望它们能够按预期工作?

Answers:



13

alias命令的语法在所有Bourne样式的shell中都相同。所以,你可以在分享~/.zshrc~/.bashrc~/.kshrc~/.shrc,只要他们让所有的炮弹感。

只要您使用所有外壳程序都支持的语法子集,变量定义和函数定义也一样。

如果您不使用低于4.0的zsh版本,则可以将所有与Shell无关的定义放在一个名为(say)的文件中~/.common.rc.sh,其中第一行是

emulate -LR sh 2>/dev/null

这告诉zsh仅在此文件中包含sh兼容语法。然后来源,接近年初的文件~/.bashrc~/.bashrc~/.kshrc等等。

这基本上就是我要做的。例如,我有几分复杂的代码,对产生的别名ls与取决于什么可用我最喜欢的选项(--color-G-F等); 它与外壳无关,所以进来.common.rc.sh。我也有依赖于shell的别名,例如alias zcp='zmv -C'in .zshrc


1
如果/bin/sh在我的别名文件的顶部放置一个shebang,它将按我打算用于所有shell的方式工作吗?
Zameer Manji

1
@ZameerManji不,不要放在#!一行:这不是一个独立的脚本,只能从另一个脚本中获取。#!无论如何都不会改变外壳的行为。
吉尔斯(Gilles)'所以

3
我发现一个很小的区别是zsh alias对待+以引入选项作为开头的参数-,因此alias +=something必须用alias -- +=somethingzsh 编写。不要以为emulate改变。
Mikel

~/.shrc由于Bourne Shell具有最强大的别名实现,但zsh使用不兼容的选项名称,因此请务必谨慎。在Bourne Shell中alias -g创建一个持久别名$HOME/.globals。仅在不超过POSIX功能的情况下,共享别名定义才是安全的。
Schily

2

zshalias允许使用全局别名,而bashs仅在行的开头扩展。

zsh

alias -g L="| less -FRX"

然后,您可以执行以下操作:

verbose-command L

有关有用的全局别名的列表,请参见此处


所有扩展别名称为“全局”别名是一个非常糟糕的主意,因为存在局部别名的概念,该别名仅限于特定目录,而38年以来的全局别名适用于与部门无关的别名。这个概念来自UNOS,始于1980年,自6年以来一直在Bourne Shell中实施。UNOS也在1980年引入了所有扩展别名,zsh可以进行一些研究来避免这种类型的冲突。参见schillix.sourceforge.net/man/man1/bosh.1.html
schily'8
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.