Bash 为什么shell执行的是别名而不是函数?

Bash 为什么shell执行的是别名而不是函数?,bash,function,shell,alias,Bash,Function,Shell,Alias,我在.bashrc中添加了一些别名作为git命令的快捷方式。 一个例子是git add 但是当我对ga函数做了一些更改时,比如: function ga() { echo "hello" } 并且在终端中使用ga,它仍然在使用git add 我试图通过编辑.bashrc,然后使用source~/.bashrc注释掉ga。但是,它仍然执行别名而不是函数 原因是什么?您忘记删除旧定义。最简单的方法就是打开一个新的交互式bashshell。与其寻找.bashrc,只需执行 b

我在
.bashrc
中添加了一些别名作为git命令的快捷方式。
一个例子是
git add

但是当我对
ga
函数做了一些更改时,比如:

function ga() {
  echo "hello"
}
并且在终端中使用
ga
,它仍然在使用
git add

我试图通过编辑.bashrc,然后使用
source~/.bashrc
注释掉
ga
。但是,它仍然执行别名而不是函数


原因是什么?

您忘记删除旧定义。最简单的方法就是打开一个新的交互式bashshell。与其寻找
.bashrc
,只需执行

bash
当然,这意味着在当前shell中手动定义的函数/别名/非导出变量也会丢失。

我找到了一个。 我使用
unalias
删除了
ga

unalias ga

ga() {
  echo "ZAWARUDO"
}

定义别名时,必须考虑在函数之前查找别名:

$ alias hello="echo 'this is a hello alias'"
$ function hello() { echo "this is a hello function"; }
$ hello
this is a hello alias
#               ^^^^^  <--- it executes the alias, not the function!
您还可以使用
unalias
,因此别名将被删除

$ unalias hello
$ hello
this is a hello function
#               ^^^^^^^^
如果别名和函数具有命令的名称呢?然后,通过以下方法,它变得很方便:

如图所示:

别名在函数之前查找:如果同时有一个名为
foo
的函数和别名,
foo
调用别名。(如果别名
foo
正在扩展,它将被临时阻止,这使得
alias ls='ls--color'
之类的功能可以正常工作。此外,您还可以通过运行
\foo
随时绕过别名)不过,我不希望看到可测量的性能差异

进一步阅读:

  • (他们说,对于几乎所有的用途,shell函数都比别名更受欢迎)

您是否有
ga
别名?
类型ga的输出是什么?
未指定任何内容,未添加任何内容。也许你想说“git add.”?
这与使用
git add
是一样的。它仍在使用旧功能,而不是带有
echo
的新功能。您已完全更改了问题和报告的故障。你到底在做什么还不清楚。我将删除我的答案,请给出导致错误发生的确切步骤当我进行编辑时,我只是尝试不同的可能解决方案,但我仍在做相同的事情。我想为git命令创建一个函数/快捷方式。确切的步骤是,我已经在
~/.bashrc
中定义了我的函数/快捷方式。然后在
~/.bash\u profile
中找到它的来源。当我做一些更改时,即使我同时源代码
~/.bash\u profile
~/bashrc
,这些更改也不会反映出来。虽然我已经通过使用
unalias
解决了这个问题,但我仍然不知道是什么原因首先导致了这个问题。我应该在交互式bash shell中做什么?对不起,我不懂shell脚本。我已经编辑了这个问题,请再看一看。@CRIS:您的示例中没有任何shell脚本!实际上,.bashrc对于shell脚本中所需的定义来说是错误的。在.bashrc中更改某些内容后,只需在控制台中输入
bash
(即字母ns
b
a
s
h
),然后按enter键。您得到了一个新实例(作为前一个实例的子进程),因此更新了定义。@CRIS:如果您不喜欢在这里得到一个子shell,您可能(我没有测试它)可以改为执行
exec bash
。这将用一个新的bash进程替换当前的bash进程。啊,我想我在进行交互式bash时必须重新定义我的函数。不过,我更喜欢你的第二个建议。这一个和我发现的那个(使用unalias)都有效。谢谢当然,在你的特殊情况下,你需要使用unalias。否则,当前别名仍然可用。我明白了,这就是我一直在寻找的。感谢您的解释和原始资料。浏览不同的来源并提供一般性的答案很有趣,因为您的问题具有有趣的见解。很高兴它帮助了你!
$ unalias hello
$ hello
this is a hello function
#               ^^^^^^^^
$ alias date="echo 'this is an alias on date'"
$ function date() { echo "this is a function on date"; }
$ date
this is an alias on date
#          ^^^^^              <--- it executes the alias, not the function!
$ \date
this is a function on date
#         ^^^^^^^^            <--- it executes the function
$ command date
Thu Jan 21 10:56:20 CET 2021
# ^^^^^^^^^^^^^^^^^^^^^^^^^   <--- it executes the command
$ nice -n0 date
Thu Jan 21 10:56:20 CET 2021