私の関数は「関数」をどのように破壊しますか?

私の関数は「関数」をどのように破壊しますか?

私は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は、ソースファイル内の関数定義のオフセットと長さを記憶し、ソースファイル内の対応するオフセットのバイト数をダンプして関数定義を印刷します。ファイルを編集または(再)移動すると、これは明らかに中断されるため、このアプローチは基本的に欠陥があるため、置き換える必要があります。

関連情報