আমি কীভাবে আমার বাশার্কে স্থানীয় ফাংশন তৈরি করতে পারি?


40

আমার .bashrc এর কিছু কোড ছিল যা পুনরাবৃত্তি ছিল তাই আমি এটিকে সহজ করার জন্য একটি ফাংশন ব্যবহার করেছি

do_stuff() {
  local version=$1
  export FOO_${version}_X="17"
  export FOO_${version}_Y="42"
}

do_stuff '5.1'
do_stuff '5.2'

যাইহোক, এখন আমি যখন আমার শেলটি ব্যবহার করি "do_stuff" নামটি সুযোগের মধ্যে থাকে তাই আমি সেই ফাংশনটি ট্যাব-সম্পূর্ণ করতে এবং চালাতে পারি (সম্ভাব্যভাবে আমার পরিবেশের ভেরিয়েবলগুলিকে বিশৃঙ্খলাবদ্ধ করে তোলে)। "Do_stuff" কে কেবলমাত্র .brcrc এর ভিতরে দৃশ্যমান করার কোনও উপায় আছে?


2
আপনি যদি রফতানিটি না করে থাকেন তবে আপনি সাব-শেল করতেও ব্যবহার ()করতে পারেন। সরল মামলার আর একটি সম্ভাবনা হ'ল for version in 5.1 5.2লুপ ব্যবহার করা , যদিও এটি versionএড়াতে দেয় ।
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四 事件

উত্তর:


40

আপনার unsetসর্বশেষ লাইন হিসাবে ব্যবহার করুন .bashrc:

unset -f do_stuff

ফাংশন মোছা / আনসেট করবে do_stuff

ভেরিয়েবলগুলি মুছে ফেলার / আনসেট করার জন্য নীচে এটি অনুরোধ করুন:

unset variablename

আনসেটটি কি এখানেই একমাত্র উপায়? ঠিক আছে, আমি অনুমান করি যে আমি যদি আমার ফাংশনটির জন্য সত্যই দীর্ঘ এবং কুরুচিপূর্ণ নামটি ব্যবহার করি তবে এর সাথে অন্য কোনও কিছুর সংঘর্ষ হওয়ার সম্ভাবনা এত বড় হবে না ...
hugomg

তাহলে যে সমস্যা চেক মূল নিয়ম বা এর ফাংশন যদি উপস্থিত থাকে: if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi
বিশৃঙ্খলা

8
do_stuffঅন্য ফাংশনের ভিতরে ব্যবহার করা হলে এটি কাজ করবে না । আপনি যখন এই ফাংশন কল, আপনি পাবেন bash: do_stuff: command not found। আমি জানি এটি অপিপটি ঠিক যে ক্ষেত্রে কথা বলছিল তা নয় তবে এটি উল্লেখ করার মতো।
বুরহান আলী


15

অন্য বিকল্পটি হ'ল অন্যান্য স্ক্রিপ্টযুক্ত ভাষাগুলির মতো আন্ডারস্কোরগুলি ব্যবহার করে এটি নির্দেশ করতে যে আপনি এই ফাংশনটি সর্বজনীন হওয়ার জন্য চান না। আপনার _do_foo টাইপ করার সম্ভাবনা খুব ছোট এবং অন্য কারও সাথে দ্বন্দ্ব হওয়ার সম্ভাবনাও কম।


1
হ্যাঁ, একটি ব্যক্তিগত ক্রিয়াকলাপের অভিপ্রায়টি নির্দেশ করতে "_" ব্যবহার করুন তবে বিরোধের সাথে এর কোনও যোগসূত্র নেই। যে কোনও ব্যক্তির "_debug ()" বা "_সেফ_কপি ()" দরকার হতে পারে। যদি এমন কিছু থাকে যা দ্বন্দ্ব এড়াতে সহায়তা করে তবে এর আন্ডারস্কোরগুলির সাথে কোনও সম্পর্ক নেই
অ্যালোস মাহডাল

3

আমি যে সমাধানটি ভাবতে পারি কেবল তা হ'ল এটি আন্ডারস্কোর করা এবং এটি একটি সুন্দর অনন্য নাম দেওয়া, এমনকি এটি অভিনব প্যান্ট ভাষার মতো বিন্দুর সাথে নামকরণ করা ( তবে এটি আপনারsh বয়স্কে কাজ করবে না )।

হেক, এর কোনও বিরোধ নেই any

_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
    # Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
    cat <<< `echo $(xargs printf <<< "$1")`; }
}

0

একটি মন্তব্যে প্রস্তাবিত হিসাবে, আপনি একটি সাব-শেল ব্যবহার করতে পারেন:

#!/bin/bash

. <(
  do_stuff() {
    local version="$1" valid='^\w+$'

    [[ "$version" =~ $valid ]] &&
      cat <<SIDE               || echo "$FUNCNAME: invalid '$version'" >&2
export FOO_${version}_X=17
export FOO_${version}_Y=42
SIDE
  }

  do_stuff 5.0 # FOO_5.0_X is "not a valid identifier"
  do_stuff 5_1
  do_stuff 5_2
)

do_keep() { :; } # just get sure the report below actually works

set | egrep '(do_|FOO_)' |  sed -e 's,^,set:\x09,'

আমরা চাই কেবলমাত্র পার্শ্ব প্রতিক্রিয়া ( hereডকুমেন্ট ব্যবহার করে <<SIDE) এর জন্য সাব-স্টেল স্ট্যান্ডার্ড আউটপুটটিতে অন্য স্ক্রিপ্ট তৈরি করি । তারপরে আমরা উত্স দিয়ে .

ইন 'মাইস এন অ্যাবাইম' shএর শক্তি বিস্ময়ের এক ভীতিজনক উত্স।

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