4

我的 ~/.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
}

据我所知,这很好用。是否有理由避免使用同名的变量和函数?

4

3 回答 3

4

除了混乱之外,一切都很好。此外,它们也不相同:

$ 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 内建函数(帮助)
    • shell 别名(帮助别名)
    • shell 函数(帮助函数)
  2. 来自 $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

因为如果尚未对二进制文件进行哈希处理(在路径文件夹中找到),这会给您一个错误。

于 2012-10-06T03:27:27.723 回答
2

由于在 Bash 中您总是必须使用$取消引用变量,因此您可以随意使用任何您喜欢的名称。

不过,请注意覆盖全局。

也可以看看:

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_02.html

于 2012-10-06T03:30:32.757 回答
2

使用变量的替代方法:使用 bash 的command关键字(参见手册help command从提示符运行):

date() {
    case $1 in
        -R|--rfc-2822) command date ... ;;
        *) command date "$@" ;;
    esac
}
于 2012-10-06T13:24:19.723 回答