在Bash中,变量和函数可以同名吗?
我的~/.bashrc中有以下代码:在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
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函数(帮助函数)
SED=/bin/sed
AWK=/usr/bin/awk
GREP/usr/local/gnu/bin/grep
通常要做的事情是用大写字母键入变量名。这有两个用途(除了减少混淆外):
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
}