পুরানো সংজ্ঞা হিসাবে আমি কীভাবে বাশ ফাংশনটিকে নতুন করে সংজ্ঞায়িত করব?


13

পুরানো সংজ্ঞা অনুসারে কোনও বাশ ফাংশন নতুন করে সংজ্ঞায়িত করার উপায় আছে কি? উদাহরণস্বরূপ, আমি ফাংশনটির উপস্থাপিতে নিম্নলিখিত কোডের ব্লকটি যুক্ত করতে চাই 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 এ সংজ্ঞায়িত করা হয়েছে এবং ব্যাশ স্টার্ট-আপ স্ক্রিপ্টগুলির দ্বারা উত্সাহিত।

এইভাবে আমি কমান্ড প্রম্পটে এনভায়রনমেন্ট ভেরিয়েবলের মানটি জিজ্ঞাসা করতে পারি কেবলমাত্র ভেরিয়েবলের নামটি টাইপ করে (এবং এই নাম দিয়ে এই জাতীয় কোনও কমান্ড উপস্থিত নেই)। যেমন

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

আমি জানি যে আমি কেবল বর্তমান সংজ্ঞাটি অনুলিপি করে আটক করতে পারি এবং এতে আমার নিজস্ব পরিবর্তনগুলি যুক্ত করতে পারি ~/.bashrc, তবে আমি কোডটি পুনরায় ব্যবহারের সাথে জড়িত আরও মার্জিত উপায়ের জন্য সন্ধান করছি।

আমার লক্ষ্য অর্জনের আরও ভাল উপায় বা কোড উন্নতি / এক্সটেনশনগুলিও প্রশংসিত।


এই প্রশ্নটি যদি স্ট্যাকওভারফ্লোতে আরও উপযুক্ত হয় তবে কেউ কি এটির মাধ্যমে মাইগ্রেশন করতে পারে, আমি জানি না।
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
}"

আরেকটি পদ্ধতির, যা আমি আরও স্পষ্ট মনে করি তা হ'ল একটি নতুন নামে মূল ফাংশনটি সংজ্ঞায়িত করা এবং এটি আপনার সংজ্ঞা থেকে কল করা call এটি কেবল তখনই কাজ করে যদি আপনার মূল সংজ্ঞাটির স্থানীয় ভেরিয়েবলগুলিতে কাজ করার প্রয়োজন না হয়।

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

1
চিয়ার্স, এটি এখানে-নথিগুলি ব্যবহার করার জন্য আমার কাছে কখনও আসেনি no আমি মনে করি যে আমি আপনার প্রথম পদ্ধতিটিকে প্রাধান্য দিয়েছি, এটি দিয়ে সম্পূর্ণ সংজ্ঞাটি আরও সহজ করে তোলে declare -fতবে আপনি যেভাবে আসল ফানকের নাম পরিবর্তন করেছেন তা আমার পছন্দ।
tmoschou

0

ধন্যবাদ @ ম্যাট, @ ডেনিস-উইলিয়ামসন। আপনার মন্তব্যগুলি পড়ার পরে, আমি এটি পেয়েছি

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)'
}'

যদিও আমি মনে করি আমি @ গিলস সমাধান পছন্দ করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.