首先,我跑了touch file.txt
接下来,我运行了这些命令:
alias xx="file.txt"
vim xx
预期行为: vim 加载file.txt
。实际行为:vim 加载一个新文件xx
。
为什么?是因为别名只有在行首时才起作用吗?例如,如果我输入
xx
然后它进行替换并输出zsh: command not found: file.txt
。所以别名在这种情况下有效。
答案1
普通别名无论是在bash
或zsh
(您似乎正在使用的 shell,而不是bash
)中都意味着别名命令,并且仅在命令位置扩展,该位置位于行的开头,但也在, ;
, |
, &
, &&
// if
/then
之后。 .. 等,或者在其值以空格结尾的别名之后。else
while
后者是为了让你可以这样做:
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
你说
bash
,但你的错误信息是来自zsh
. zsh 不是 bash。 zsh 和 bash 都是 shell,具有相似但不完全相同的语法。它们很大程度上兼容,但不是 100%。 zsh 可以做一些 bash 可以做的事情,而 bash 可以做一些 zsh 不能做的事情。在大多数情况下,zsh 比 bash 具有更多的功能和增强功能。从
man bash
:
别名
别名允许在用作单词时用字符串代替单词。第一的一个简单的命令。
shell 维护一个别名列表,可以使用
alias
和unalias
内置命令设置和取消设置(请参阅下面的 SHELL 内置命令)。每个简单命令的第一个单词(如果未加引号)将被检查以查看它是否有别名。如果是这样,该单词将被别名的文本替换。 [...]
运行man bash
并搜索以^ALIASES
阅读完整说明。有关别名的 zsh 特定信息,请运行man zshbuiltins
并搜索和alias
,其开头为:man zshmisc
^ALIASING
混叠
检查 shell 输入中的每个符合条件的单词,看看是否为其定义了别名。如果是这样,如果别名位于命令位置(如果它可能是简单命令的第一个单词),或者别名是全局的,则它会被别名的文本替换。
如果替换文本以空格结尾,则 shell 输入中的下一个单词始终符合别名扩展的目的。 [...]