Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash中,变量和函数可以同名吗?_Bash_Variable Names - Fatal编程技术网

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

在Bash中,变量和函数可以同名吗?,bash,variable-names,Bash,Variable Names,我的~/.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

我的~/.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都会在三个不同的位置查找该命令。优先次序如下:

  • shell内置程序(帮助)
    • shell别名(帮助别名)
    • shell函数(帮助函数)
  • 从$PATH散列二进制文件('最左侧'文件夹首先扫描)
  • 变量的前缀是美元符号,这使它们与上述所有变量不同。与您的示例相比:$date和date不是一回事。因此,变量和函数不可能有相同的名称,因为它们有不同的“名称空间”

    您可能会发现这有点令人困惑,但许多脚本在文件顶部定义了“方法变量”。e、 g

    SED=/bin/sed
    AWK=/usr/bin/awk
    GREP/usr/local/gnu/bin/grep
    
    通常要做的事情是用大写字母键入变量名。这有两个用途(除了减少混淆外):

  • 没有$PATH
  • 检查所有“依赖项”是否可运行
  • 你不能像这样检查:

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

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

    由于您必须始终使用
    $
    在Bash中取消对变量的引用,因此您可以随意使用任何名称

    不过,请注意不要覆盖全局

    另请参见:


    使用变量的替代方法:使用bash的
    命令
    关键字(请参阅或从提示符运行
    帮助命令
    ):

    date() {
        case $1 in
            -R|--rfc-2822) command date ... ;;
            *) command date "$@" ;;
        esac
    }