bash 别名只能在行首起作用吗?

bash 别名只能在行首起作用吗?

首先,我跑了touch file.txt

接下来,我运行了这些命令:

alias xx="file.txt"
vim xx

预期行为: vim 加载file.txt。实际行为:vim 加载一个新文件xx

为什么?是因为别名只有在行首时才起作用吗?例如,如果我输入

xx

然后它进行替换并输出zsh: command not found: file.txt。所以别名在这种情况下有效。

答案1

普通别名无论是在bashzsh(您似乎正在使用的 shell,而不是bash)中都意味着别名命令,并且仅在命令位置扩展,该位置位于行的开头,但也在, ;, |, &, &&// if/then之后。 .. 等,或者在其值以空格结尾的别名之后。elsewhile

后者是为了让你可以这样做:

alias sudo='sudo '
alias ll='ls -l'

然后执行以下操作:

sudo ll

对于 shell 将其扩展为sudo ls -l.

尽管如此zsh,你也可以有全球的别名为:

alias -g xx=file.txt

之后xx更改为file.txt作为分隔词找到的任何位置(在删除引号之前)。

echo xx

然后将运行echo file.txt,尽管别名不会在echo xxy或中扩展echo "xx",但您也可以执行以下操作:

alias -g '"xx"=hello; echo world'

之后echo "xx"将更改为echo hello; echo world并运行这两个echo命令。

您似乎想使用变量,而不是这里的别名。

xx=file.txt
vim "$xx"

(bash 中需要引号;zsh您可以将其缩短为vim $xx)。

别名是 csh 的一项功能,csh 是 70 年代末的一个 shell,没有任何功能。在 bash 和 zsh 等类似 Bourne 的 shell 中(尽管 bash 和 zsh 是从 csh 借用了大部分功能的两个类似 Bourne 的 shell),除了在某些无法使用函数的特定情况下(例如alias forever='while true; do'或者alias fail='return 1'...


1 同样来自 70 年代末的 Bourne shell 最初既没有函数也没有别名,尽管在大约 1983 年之后不久就添加了函数。别名和历史扩展(事实上它是免费软件)极大地促进了 csh(一种带有其他功能的 shell)的流行。很大的缺陷)并解释了为什么这些功能也适用于其他一些类似 Bourne 的 shell。别名(不是历史扩展)甚至进入了 sh 的 POSIX 规范(基于 ksh 的子集),令其维护者感到遗憾的是,因为几乎不可能用这些别名来形式化一种健全的语言。甚至还曾有过尝试在那儿贬低他们

答案2

  1. 你说bash,但你的错误信息是来自zsh. zsh 不是 bash。 zsh 和 bash 都是 shell,具有相似但不完全相同的语法。它们很大程度上兼容,但不是 100%。 zsh 可以做一些 bash 可以做的事情,而 bash 可以做一些 zsh 不能做的事情。在大多数情况下,zsh 比 bash 具有更多的功能和增强功能。

  2. man bash

别名

别名允许在用作单词时用字符串代替单词。第一的一个简单的命令。

shell 维护一个别名列表,可以使用aliasunalias内置命令设置和取消设置(请参阅下面的 SHELL 内置命令)。

每个简单命令的第一个单词(如果未加引号)将被检查以查看它是否有别名。如果是这样,该单词将被别名的文本替换。 [...]

运行man bash并搜索以^ALIASES阅读完整说明。有关别名的 zsh 特定信息,请运行man zshbuiltins并搜索和alias,其开头为:man zshmisc^ALIASING

混叠

检查 shell 输入中的每个符合条件的单词,看看是否为其定义了别名。如果是这样,如果别名位于命令位置(如果它可能是简单命令的第一个单词),或者别名是全局的,则它会被别名的文本替换。

如果替换文本以空格结尾,则 shell 输入中的下一个单词始终符合别名扩展的目的。 [...]

相关内容