古い定義の観点からbash関数を再定義するにはどうすればよいですか?


13

古い定義の観点からbash関数を再定義する方法はありますか?たとえば、次のコードブロックを関数のプリアンブルに追加しますcommand_not_found_handle ()

# Check if $1 is instead a bash variable and print value if it is
local VAL=$(eval echo \"\$$1\")
if [ -n "$VAL" ] && [ $# -eq 1 ]; then
    echo "$1=$VAL"
    return $?
fi

現在、/ etc / profile.d / PackageKit.shで定義されており、bash起動スクリプトをソースとしています。

そうすれば、変数名を入力するだけでコマンドプロンプトで環境変数の値を照会できます(その名前のコマンドが存在しない場合)。例えば

user@hostname ~:$ LANG
LANG=en_AU.utf8

現在の定義をコピーして貼り付け、に独自の変更を追加できることは知っていますが~/.bashrc、コードの再利用を伴うよりエレガントな方法を探しています。

私の目標やコードの改善/拡張を達成するためのより良い方法も高く評価されています。


この質問がstackoverflowにより適している場合、誰かがそれを移行できますか、私は知りません。
tmoschou

3
私が思うに、スタックオーバーフロー上のこの記事は、あなたの質問に答えます。
マット

2
代わりにeval、あなたは間接を使用することができますlocal VAL=$(echo ${!1})
追って通知があるまで一時停止しました。

回答:


14

関数の現在の定義を出力し、それを関数定義内に含めることができます eval句。

current_definition=$(declare -f command_not_found_handle)
current_definition=${current_definition#*\{}
current_definition=${current_definition%\}}
prefix_to_add=$(cat <<'EOF'
  # insert code here (no special quoting required)
EOF
)
suffix_to_add=$(cat <<'EOF'
  # insert code here (no special quoting required)
EOF
)
eval "command_not_found_handle () {
  $prefix_to_add
  $current_definition
  $suffix_to_add
}"

私がより明確に感じる別のアプローチは、新しい名前で元の関数を定義し、定義からそれを呼び出すことです。これは、元の定義のローカル変数を操作する必要がない場合にのみ機能します。

eval "original_$(declare -f command_not_found_handle)"
command_not_found_handle () {
  
  original_command_not_found_handle
  
}

1
乾杯、ヒアドキュメントを使用することは私には決して起こりませんでした。私はあなたの最初の方法を好み、で定義全体を表示するのが簡単になると思いますdeclare -fが、元のfuncの名前を変更する方法が好きです。
-tmoschou

0

@ mat、@ dennis-williamsonに感謝します。あなたのコメントを読んだ後、これは私が得たものです

eval 'command_not_found_handle () {

    local VAL=$(echo "${!1}")
    if [ -n "$VAL" ] && [ $# -eq 1 ]; then
            echo "$1=$VAL"
            return $?
    fi

    '$(declare -f command_not_found_handle |
    tail -n +3 | head -n -1)'
}'

私は@Gillesソリューションを好むと思いますが。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.