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