gpt4 book ai didi

bash - 在 Bash 中,变量和函数可以同名吗?

转载 作者:行者123 更新时间:2023-11-29 09:09:44 25 4
gpt4 key购买 nike

我的 ~/.bashrc 中有以下代码:

date=$(which date)
date() {
if [[ $1 == -R || $1 == --rfc-822 ]]; then
# Output RFC-822 compliant date string.
# e.g. Wed, 16 Dec 2009 15:18:11 +0100
$date | sed "s/[^ ][^ ]*$/$($date +%z)/"
else
$date "$@"
fi
}

据我所知,这工作正常。是否有理由避免使用同名变量和函数?

最佳答案

除了令人困惑之外还不错。此外,它们并不相同:

$ date=/bin/ls
$ type date
date is hashed (/bin/date)
$ type $date
/bin/ls is /bin/ls
$ moo=foo
$ type $moo
-bash: type: foo: not found
$ function date() { true; }
$ type date
date is a function
date ()
{
true*emphasized text*
}

$ which true
/bin/true
$ type true
true is a shell builtin

无论何时键入命令,bash 都会在三个不同的位置查找该命令。优先级如下:

  1. shell 内置函数(帮助)
  2. >
    • shell别名(帮助别名)
    • shell 函数(帮助函数)
  3. 来自 $PATH 的哈希二进制文件(首先扫描“最左边”的文件夹)

变量以美元符号为前缀,这使得它们与上述所有变量不同。与您的示例进行比较: $date 和 date 不是一回事。因此,变量和函数实际上不可能具有相同的名称,因为它们具有不同的“命名空间”。

您可能会觉得这有点令人困惑,但许多脚本在文件顶部定义了“方法变量”。例如

SED=/bin/sed
AWK=/usr/bin/awk
GREP/usr/local/gnu/bin/grep

通常的做法是用大写字母键入变量名。这有两个用途(除了减少混淆):

  1. 没有$PATH
  2. 检查所有“依赖项”是否可运行

你真的不能这样检查:

if [ "`which binary`" ]; then echo it\'s ok to continue.. ;fi

因为如果二进制文件还没有被散列(在路径文件夹中找到),这会给你一个错误。

关于bash - 在 Bash 中,变量和函数可以同名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12756398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com