我的函数如何破坏“函数”?

我的函数如何破坏“函数”?

我为 git checkout 编写了一个 ksh 函数(为了公众问题,我删除了一些不相关的专有组件,如果您想知道为什么它对我有用):

# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
   git checkout $1
fi
}

但是,当我使用命令行查看该函数时functions,我得到了一个奇怪的输出:

$ functions checkout
checkout()
}

# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
  $ <- (this is my PS1, which I'm not writing here because it's big)

为什么功能显示不正常?我functions在技术上是否通过在函数内部使用函数名称来突破?我在 RHEL 上使用 ksh93u+ 2012-08-01。

答案1

看来您可能遇到了稍后修复的错误这次提交。我可以使用 CentOS 7 的 ksh93 重现它:

$ cat a
# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
   git checkout $1
fi
}
$ . ./a
$ functions checkout
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
   git checkout $1
fi
}
$ vi a

编辑函数来源的文件,在函数定义之前添加一些文本。现在:

$ cat a
01234567801234567890123456789
}
# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
   git checkout $1
fi
}
$ functions checkout
checkout()
}
# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout mast$

引用该提交的日志:

[v1.1] typeset -f <functname>:使用生成脚本sh_deparse()

问题重现器:

  • 找到或编写带有函数定义的脚本
  • .使用或获取脚本source
  • typeset -f使用;打印函数定义看起来不错
  • 编辑文件以在函数定义之前或之中添加或删除字符,或者重命名或删除文件
  • 再次打印函数定义typeset -f;输出已损坏!

原因:ksh 会记住源文件中函数定义的偏移量和长度,并通过简单地转储源文件中该偏移量的字节数来打印函数定义。如果文件被编辑或(重新)移动,这显然会破坏,因此这种方法从根本上来说是有缺陷的,需要更换。

相关内容