* নিক্সের জন্য অবজেক্ট-ওরিয়েন্টেড শেল


38

উপস্থাপনা: আমি বাশকে ভালবাসি এবং কোনও প্রকার তর্ক বা পবিত্র-যুদ্ধ শুরু করার কোনও ইচ্ছা নেই এবং আশা করি এটি একটি চূড়ান্ত প্রশ্ন নয়।

এই প্রশ্নটি সুপারভাইজারের এই পোস্টের সাথে কিছুটা সম্পর্কিত , তবে আমি মনে করি না যে ওপি সত্যই জানত তিনি কী চেয়েছিলেন। আমি ফ্রিবিএসডি, লিনাক্স, ওএস এক্স এবং উইন্ডোজ-এ সাইগউইন ব্যবহার করি use উইন্ডোজে পাওয়ারশেলের সাথে সম্প্রতি আমারও বিস্তৃত অভিজ্ঞতা রয়েছে।

ইতিমধ্যে উপলভ্য বা রচনাগুলিতে * নিক্সের জন্য একটি শেল রয়েছে, যা বাশের সাথে সামঞ্জস্যপূর্ণ তবে মিশ্রণে অবজেক্ট-ওরিয়েন্টেড স্ক্রিপ্টিংয়ের একটি স্তর যুক্ত করে? আমি যে বিষয়টি কেবল কাছে এসেছি তা হল পাইথন কনসোল, তবে যতদূর আমি বলতে পারি এটি স্ট্যান্ডার্ড শেল পরিবেশে অ্যাক্সেস সরবরাহ করে না। উদাহরণস্বরূপ, আমি পাই না কেবল, cd ~এবং lsতারপরে chmod +x fileপাইথন কনসোলটির ভিতরে। আমাকে স্ট্যান্ডার্ড ইউনিক্স বাইনারিগুলির চেয়ে এই কাজগুলি সম্পাদনের জন্য পাইথন ব্যবহার করতে হবে বা পাইথন কোড ব্যবহার করে বাইনারিগুলি কল করতে হবে।

এ জাতীয় শাঁসের কি অস্তিত্ব আছে?


3
আছে Pash কিন্তু যে আরো অনেক কিছু ব্যাশ মত চেয়ে PowerShell মত।
প্রথম

1
@ সম্ভবত আপনি প্যাশ করার জন্য একটি উত্তর লিখতে হবে ... যদিও আমি কিছুই জানি না, তবে, পাওয়ারশেল এটি ওও শেল।
xenoterracide

4
আরে, আপনার আইপিথনটি পরীক্ষা করা উচিত । যদি আপনি এমন একটি অভিব্যক্তি প্রবেশ করেন যা অজগর হিসাবে বোঝায় না, এটি শেল কমান্ডে এটি মানচিত্র করার চেষ্টা করবে। উদাহরণস্বরূপ, কাপড় মত cd ~অনুসরণ lsব্যাশ হিসেবে কাজ করে। আপনি পাইথন ভেরিয়েবলগুলিকে আউটপুট বরাদ্দ করতে পারেন (লাইনের তালিকা। বাছাই করুন) এর মতো কমান্ড সহ listing = !ls
5:43

@ প্রত্যাশিত: দুর্দান্ত, আমি এটি যাচাই করবো
রবার্ট এস সিয়াসসিও

1
@ বিদ্রূপিত: আইপিথন আমি যে জিনিসগুলি করতে চাই তার জন্য বেশ ভাল হয়েছে, ধন্যবাদ!
রবার্ট এস সিয়াসসিও

উত্তর:


43

আমি শেলের তিনটি পছন্দসই বৈশিষ্ট্যগুলি ভাবতে পারি:

  • ইন্টারেক্টিভ ব্যবহারযোগ্যতা: সাধারণ কমান্ডগুলি টাইপ করার জন্য দ্রুত হওয়া উচিত; সমাপ্তির; ...
  • প্রোগ্রামিং: ডেটা স্ট্রাকচার; সম্মতি (চাকরি, পাইপ, ...); ...
  • সিস্টেম অ্যাক্সেস: ফাইল, প্রক্রিয়া, উইন্ডো, ডাটাবেস, সিস্টেম কনফিগারেশন, ...

ইউনিক্স শেলগুলি ইন্টারেক্টিভ দিকটিতে মনোনিবেশ করে এবং বেশিরভাগ সিস্টেম অ্যাক্সেস এবং কিছু প্রোগ্রামিংকে বাহ্যিক সরঞ্জামগুলিতে সাবকন্ট্র্যাক্ট করে, যেমন:

  • সাধারণ গণিতের জন্য বিসি
  • OpenSSL ক্রিপ্টোগ্রাফি জন্য
  • sed , awk এবং টেক্সট প্রক্রিয়াকরণের জন্য অন্যদের
  • বেসিক টিসিপি / আইপি নেটওয়ার্কিংয়ের জন্য এনসি
  • ftp এফটিপি জন্য
  • mail, Mail, mailx, ইত্যাদি মৌলিক ই-মেইলের জন্য
  • cron নির্ধারিত কাজের জন্য
  • বেসিক এক্স উইন্ডো ম্যানিপুলেশন জন্য wmctrl
  • dcop -ডি-ই ≤3.x লাইব্রেরির জন্য
  • dbus, সরঞ্জাম ( dbus-*বা qdbus ) বিভিন্ন সিস্টেম তথ্য ও কনফিগারেশন কাজের জন্য (যেমন-ডি-ই আধুনিক ডেস্কটপ পরিবেশের সহ ≥4)

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

ইউনিক্স শেলগুলির একটি প্রধান সীমাবদ্ধতা এবং আমি সন্দেহ করি যে এটি আপনার "অবজেক্ট-ওরিয়েন্টেড স্ক্রিপ্টিং" প্রয়োজনীয়তা অনুসারে করা হয়েছে, তা হ'ল তারা এক কমান্ড থেকে পরবর্তী কমান্ডের তথ্য বজায় রাখা বা কমান্ডের সাথে ফ্যানসিয়ারের সাথে মিশ্রণে ভাল নয় একটি পাইপলাইন। বিশেষত, আন্তঃ প্রোগ্রাম যোগাযোগটি পাঠ্য-ভিত্তিক হয়, সুতরাং অ্যাপ্লিকেশনগুলি কেবল তখনই সংযুক্ত করা যায় যদি তারা তাদের ডেটাটি একটি উপযোগী উপায়ে ক্রমিক করে তোলে। এটি উভয়ই একটি আশীর্বাদ এবং একটি অভিশাপ: সমস্ত কিছু-পাঠ্য পদ্ধতির সহজেই সাধারণ কাজগুলি দ্রুত সম্পাদন করা সহজ করে তোলে, তবে আরও জটিল কাজের জন্য বাধা বাড়িয়ে তোলে।

ইন্টারেক্টিভ ব্যবহারযোগ্যতা প্রোগ্রামের রক্ষণাবেক্ষণের পরিবর্তে চলে। ইন্টারেক্টিভ প্রোগ্রামগুলি সংক্ষিপ্ত হওয়া উচিত, স্বল্প উদ্ধৃতি প্রয়োজন, পরিবর্তনশীল ডিক্লেয়ারেশন বা টাইপিং ইত্যাদি নিয়ে আপনাকে বিরক্ত করবেন না রক্ষণাবেক্ষণযোগ্য প্রোগ্রামগুলি পড়াযোগ্য হওয়া উচিত (যাতে অনেক সংক্ষিপ্ত বিবরণ না থাকে), পাঠযোগ্য হওয়া উচিত (যাতে আপনার কোনও খালি শব্দ কিনা তা ভাবতে হবে না) একটি স্ট্রিং, একটি ফাংশন নাম, একটি ভেরিয়েবল নাম, ইত্যাদি), ভেরিয়েবল ডিক্লেয়ারেশন এবং টাইপিং ইত্যাদির মতো ধারাবাহিকতা পরীক্ষা করা উচিত

সংক্ষেপে, একটি শেল পৌঁছনো একটি কঠিন আপস। ঠিক আছে, এটি উদাহরণস্বরূপ, রেন্ট বিভাগটি শেষ করে।


  • পার্ল শেল (PSH) "পার্ল শক্তি সঙ্গে একটি ইউনিক্স শেল ইন্টারেক্টিভ প্রকৃতি সম্মিলন"। সাধারণ কমান্ডগুলি (এমনকি পাইপলাইনগুলি) শেল সিনট্যাক্সে প্রবেশ করা যেতে পারে; বাকি সব পার্ল। প্রকল্পটি দীর্ঘদিন ধরে বিকাশে নেই। এটি ব্যবহারযোগ্য, তবে সেই স্থানে পৌঁছায়নি যেখানে আমি এটিকে খাঁটি পার্ল (স্ক্রিপ্টিংয়ের জন্য) বা খাঁটি শেল (ইন্টারেক্টিভভাবে বা স্ক্রিপ্টিংয়ের জন্য) ব্যবহার করে বিবেচনা করব।

  • আইপিথন একটি উন্নত ইন্টারেক্টিভ পাইথন কনসোল, বিশেষত সংখ্যাসূচক এবং সমান্তরাল কম্পিউটিং লক্ষ্য করে। এটি তুলনামূলকভাবে তরুণ প্রকল্প is

  • irb (ইন্টারেক্টিভ রুবি) হল পাইথন কনসোলের রুবি সমতুল্য।

  • স্ক্যাশ হ'ল একটি স্কিম বাস্তবায়ন (অর্থাত্ একটি শালীন প্রোগ্রামিং ল্যাঙ্গুয়েজ) unতিহ্যগতভাবে ইউনিক্স শেলগুলিতে (স্ট্রিং, প্রসেস, ফাইল) পাওয়া যায় এমন সিস্টেম বাঁধার সাথে with তবে এটি ইন্টারেক্টিভ শেল হিসাবে ব্যবহারযোগ্য হওয়ার লক্ষ্য নয়।

  • zsh একটি উন্নত ইন্টারেক্টিভ শেল। এর দৃ strong় বিন্দুটি ইন্টারঅ্যাক্টিভিটি (কমান্ড লাইন সংস্করণ, সমাপ্তি, সংশ্লেষ তবে ক্রিপ্টিক সিনট্যাক্স সহ সাধারণ কাজগুলি)। এর প্রোগ্রামিং বৈশিষ্ট্যগুলি দুর্দান্ত (ksh সমতুল্য) নয়, তবে এটি টার্মিনাল নিয়ন্ত্রণ, রেজেক্সস, নেটওয়ার্কিং ইত্যাদির জন্য অনেকগুলি লাইব্রেরি নিয়ে আসে comes

  • ইউনিক্স-স্টাইলের শেলটিতে মাছ একটি পরিষ্কার শুরু। এটিতে আরও ভাল প্রোগ্রামিং বা সিস্টেম অ্যাক্সেস বৈশিষ্ট্য নেই। যেহেতু এটি sh এর সাথে সামঞ্জস্যতা ভঙ্গ করে, আরও উন্নত বৈশিষ্ট্যগুলি বিকশিত করার জন্য এটির আরও বেশি জায়গা রয়েছে, তবে তা ঘটেনি।


সংযোজন: ইউনিক্স টুলবক্সের আর একটি অংশ অনেকগুলি বিষয়কে ফাইল হিসাবে বিবেচনা করছে:

  • বেশিরভাগ হার্ডওয়্যার ডিভাইস ফাইল হিসাবে অ্যাক্সেসযোগ্য।
  • লিনাক্সের অধীনে, /sysআরও হার্ডওয়্যার এবং সিস্টেম নিয়ন্ত্রণ সরবরাহ করে।
  • অনেকগুলি ইউনিক্স ভেরিয়েন্টে, /procফাইল সিস্টেমের মাধ্যমে প্রক্রিয়া নিয়ন্ত্রণ করা যায় ।
  • ফুস নতুন ফাইল সিস্টেম লিখতে সহজ করে তোলে। ফ্লাইতে ফাইল ফর্ম্যাট রূপান্তর করার জন্য, বিভিন্ন নেটওয়ার্ক প্রোটোকলগুলিতে ফাইল অ্যাক্সেস করার জন্য, সংরক্ষণাগারটির অভ্যন্তরে অনুসন্ধান করার জন্য ইতিমধ্যে বিদ্যমান ফাইল সিস্টেম রয়েছে

সম্ভবত ইউনিক্স শেলগুলির ভবিষ্যত কমান্ডগুলির মাধ্যমে আরও ভাল সিস্টেম অ্যাক্সেস নয় (এবং কমান্ডগুলি একত্রিত করার জন্য আরও ভাল নিয়ন্ত্রণ কাঠামো) নয় তবে ফাইল সিস্টেমগুলির মাধ্যমে আরও ভাল সিস্টেম অ্যাক্সেস (যা কিছুটা আলাদাভাবে একত্রিত করে - আমি মনে করি না কী মূল প্রতিমাগুলির মত কাজ করেছে) শেল পাইপ) এখনও আছে)।


1
আপনি বলার পরে আপনি মাথার পেরেকটি আঘাত করলেন "আপনি সন্দেহ করছেন এটাই আমার সন্দেহ"। আমি এই প্রশ্নটি জিজ্ঞাসা করার মূল কারণটি হ'ল আমি ইউনিক্স সরঞ্জামগুলির শক্তি থাকা পছন্দ করি তবে প্রোগ্রামগুলির মধ্যে পাঠ্য-ভিত্তিক মিথস্ক্রিয়া অবশ্যই 'আরও জটিল কাজের জন্য বাধা সৃষ্টি করে'। আমি পাঠ্য পার্সার লেখার জন্য আমার প্রোগ্রামিংয়ের বেশিরভাগ সময় ব্যয় করেছি :) আমি মনে করি এটি খুব সুচিন্তিত উত্তর। এটি বিষয়টির জটিলতা এবং বিষয়টির কেন্দ্রবিন্দুতে পৌঁছে। আমি আশা করি আমি এটি দু'বার উপস্থাপন করতে পারতাম: পি
রবার্ট এস সিয়াসিও

1
আইপিথনের জন্য +1, যদিও ওপি কী করতে চায় তা আমার কোনও ধারণা নেই।
ফালমারি

1
এটি দুর্দান্ত উত্তর: আমি সত্যই মনে করি যে একটি আকর্ষণীয় পিএইচডি থিসিসের বীজ এখানে রয়েছে।
জিগি

1
@ রবার্টস সিআইসিসিও এই উত্তরটি সাম্প্রতিক একটি পোস্টে যুক্ত হয়েছে, এবং পাঠ্য পার্স সম্পর্কে আপনার মন্তব্য আমাকে এই ভাবনায় পেয়েছে ... যদি পাঠ্য পার্সিং আপনার "জটিল কাজগুলি" সম্পাদন করার জন্য যথেষ্ট হয় তবে আপনার কাছে একটি ছোট স্ক্রিপ্ট বা প্রোগ্রাম নেই যা কার্যকর করে এটি এবং আপনার ব্যাশ স্ক্রিপ্টগুলিতে এটি কোনও ধরণের ফাংশন হিসাবে ব্যবহার করবেন? কেবল একটি চিন্তাভাবনা, আমার বেল্টের নীচে কথা বলার মতো খুব বেশি বাশ স্ক্রিপ্টিং অভিজ্ঞতা নেই।
অক্সভিভি

1
@ অনন্যায়গ কোন উপায়ে মাছকে "অবজেক্ট-ওরিয়েন্টেড" বলা যেতে পারে? মাছ মূলত সরল হওয়া লক্ষ্য করে। বিকল্পগুলির চেয়ে আরও শক্তিশালী কোনও উপায় আছে কি?
গিলস 'অশুভ হওয়া বন্ধ করুন'

13

ব্যাশে ক্লাস বা অবজেক্টগুলি প্রয়োগ করতে আপনার খুব বেশি বাশ কোডের দরকার নেই।

বলুন, 100 লাইন।

বাশের সহকারী অ্যারে রয়েছে যা উত্তরাধিকার, পদ্ধতি এবং বৈশিষ্ট্য সহ একটি সাধারণ অবজেক্ট সিস্টেম প্রয়োগ করতে ব্যবহার করা যেতে পারে।

সুতরাং, আপনি এটির মতো কোনও শ্রেণি সংজ্ঞায়িত করতে পারেন:

class Queue N=10 add=q_add remove=q_remove

এই সারিটির উদাহরণ তৈরি করা এইভাবে করা যেতে পারে:

class Q:Queue N=100

অথবা

inst Q:Queue N=100

যেহেতু ক্লাসগুলি একটি অ্যারের সাথে প্রয়োগ করা হয়, শ্রেণি এবং ইনস্টটগুলি সত্যই প্রতিশব্দ - জাভাস্ক্রিপ্টে এর মতো সাজানো।

এই সারিতে আইটেম যুক্ত করা এইভাবে করা যেতে পারে:

$Q add 1 2 aaa bbb "a string"

ভেরিয়েবল এক্স-এ আইটেমগুলি সরিয়ে ফেলা হতে পারে:

$Q remove X

এবং কোনও বস্তুর ডাম্পিং স্ট্রাকচার এভাবে করা যেতে পারে:

$Q dump

যা এরকম কিছু ফিরে আসবে:

Q {
      parent=Queue {
                     parent=ROOT {
                                   this=ROOT
                                   0=dispatch ROOT
                                 }
                     class=Queue
                     N=10
                     add=q_add
                     remove=q_remove
                     0=dispatch Queue
                   }
      class=Q
      N=4
      add=q_add
      remove=q_remove
      0=dispatch Q
      1=
      2=ccc ddd
      3=
      4=
    }

ক্লাসগুলি এই জাতীয় ক্লাস ফাংশন ব্যবহার করে তৈরি করা হয়:

class(){
    local _name="$1:"                            # append a : to handle case of class with no parent
    printf "$FUNCNAME: %s\n" $_name
    local _this _parent _p _key _val _members
    _this=${_name%%:*}                           # get class name
    _parent=${_name#*:}                          # get parent class name
    _parent=${_parent/:/}                        # remove handy :
    declare -g -A $_this                         # make class storage
    [[ -n $_parent ]] && {                       # copy parent class members into this class
        eval _members=\"\${!$_parent[*]}\"       # get indices of members
        for _key in $_members; do                # inherit members from parent
            eval _val=\"\${$_parent[$_key]}\"    # get parent value
            eval $_this[$_key]=\"$_val\"         # set this member
        done
    }
    shift 1

    # overwrite with specific values for this object
    ROOT_set $_this "$@" "0=dispatch $_this" "parent=${_parent:-ROOT}" "class=$_this"
}

দ্রষ্টব্য: একটি নতুন শ্রেণি বা উদাহরণ সংজ্ঞা দেওয়ার সময়, আপনি যে কোনও সদস্যের মান বা ফাংশনকে ওভাররাইড করতে পারেন।

বাশ এসোসিয়েটিভ অ্যারেগুলির একটি ছদ্মবেশ রয়েছে যা এই কাজটি ঝরঝরে করে তোলে: $ Q [0]। $ Q এর সাথে সমান। এর অর্থ হ'ল আমরা কোনও পদ্ধতি প্রেরণের ফাংশনটি কল করতে অ্যারে নামটি ব্যবহার করতে পারি:

dispatch(){
    local _this=$1 _method=$2 _fn
    shift 2
    _fn="$_this[$_method]"                       # reference to method name
    ${!_fn} $_this "$@"
}

একটি নীচের দিকটি হ'ল আমি তথ্যের জন্য [0] ব্যবহার করতে পারি না তাই আমার সারিগুলি (এই ক্ষেত্রে) সূচক = 1 থেকে শুরু হয়। বিকল্পভাবে আমি "q + 0" এর মতো সহযোগী সূচকগুলি ব্যবহার করতে পারতাম।

করতে পেতে এবং সেট সদস্যদের আপনি ভালো কিছু করতে পারে:

# basic set and get for key-value members
ROOT_set(){                                       # $QOBJ set key=value
    local _this=$1 _exp _key _val
    shift
    for _exp in "$@"; do
        _key=${_exp%%=*}
        _val="${_exp#*=}"
        eval $_this[$_key]=\"$_val\"
    done
}

ROOT_get(){                                       # $QOBJ get var=key
    local _this=$1 _exp _var _key
    shift
    for _exp in "$@"; do
        _var=${_exp%%=*}
        _key=${_exp#*=}
        eval $_var=\"\${$_this[$_key]}\"
    done
}

এবং ডাম্প একটি বস্তু গঠন, আমি এই তৈরি করেছেন:

দ্রষ্টব্য: ব্যাশে ওওপি-র জন্য এটি প্রয়োজন হয় না তবে কীভাবে অবজেক্ট তৈরি করা হয় তা দেখে ভাল লাগল।

# dump any object
obj_dump(){                                      # obj_dump <object/class name>
    local _this=$1 _j _val _key; local -i _tab=${2:-(${#_this}+2)}  # add 2 for " {"
    _tab+=2                                      # hanging indent from {
    printf "%s {\n" $_this
    eval "_key=\"\${!$_this[*]}\""
    for _j in $_key; do                          # print all members
        eval "_val=\"\${$_this[\$_j]}\""
        case $_j in
            # special treatment for parent
            parent) printf "%*s%s=" $_tab "" $_j; ${!_val} dump $(( _tab+${#_j}+${#_val}+2 ));;
                 *) printf "%*s%s=%s\n" $_tab "" $_j "$_val";;
        esac
    done
    (( _tab-=2 ))
    printf "%*s}\n" $_tab ""
    return 0
}

আমার ওওপি নকশা বস্তুগুলির মধ্যে অবজেক্টগুলি বিবেচনা করে না - উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণি ব্যতীত। আপনি এগুলি পৃথকভাবে তৈরি করতে বা শ্রেণীর () এর মতো একটি বিশেষ নির্মাতা তৈরি করতে পারেন। অভ্যন্তরীণ ক্লাসগুলি পুনরাবৃত্তভাবে মুদ্রণের জন্য * আপত্তি_ডাম্প * পরিবর্তন করতে হবে।

উহু! এবং আমি ম্যানুয়ালি ক্লাস ফাংশনটি সহজ করার জন্য একটি মূল শ্রেণীর সংজ্ঞা দিই :

declare -gA ROOT=(    \
  [this]=ROOT         \
  [0]="dispatch ROOT" \
  [dump]=obj_dump     \
  [set]="ROOT_set"    \
  [get]="ROOT_get"    \
)

কয়েকটি কিউ ফাংশন সহ আমি কিছু ক্লাসের সংজ্ঞা দিয়েছি:

class Queue          \
    in=0 out=0 N=10  \
    dump=obj_dump    \
    add=q_add        \
    empty=q_empty    \
    full=q_full      \
    peek=q_peek      \
    remove=q_remove

class RoughQueue:Queue     \
    N=100                  \
    shove=q_shove          \
    head_drop=q_head_drop

কিছু সারি উদাহরণ তৈরি করে এবং সেগুলি কাজ করে:

class Q:Queue N=1000
$Q add aaa bbb "ccc ddd"
$Q peek X
$Q remove X
printf "X=%s\n" "$X"
$Q remove X
printf "X=%s\n" "$X"
$Q remove X
printf "X=%s\n" "$X"


class R:RoughQueue N=3
$R shove aa bb cc dd ee ff gg hh ii jj
$R dump

কাজ ভাল কিন্তু এটি কুরুচিপূর্ণ । এবং সম্পূর্ণরূপে কি bashজন্য নয়। পাঠ্য প্রক্রিয়াকরণের জন্য কেন শেল লুপ ব্যবহার করবেন না সে সম্পর্কে স্টিফেনের জবাবের কথা মনে করিয়ে দেয়, বিশেষত বিভাগটি "ধারণামূলকভাবে" শীর্ষক যে বিভাগটি সি এবং এর মতো ভাষার মধ্যে উদ্দেশ্যের পার্থক্যের বিবরণ দেয় bashunix.stackexchange.com/a/169765/135943
ওয়াইল্ডকার্ড

1
কাজ করতেও পারে? এটি কাজ করে, তবে আপনার বক্তব্যটি ভুল না হলেও এটি করা হয় না। আমি ওপি প্রশ্নের উত্তরও দিলাম না, তবে যদি ব্যাশটি টিসি হয় তবে আমি ভেবেছিলাম এটি অবজেক্টগুলিকে প্রক্রিয়াজাত করতে সক্ষম হওয়া উচিত। এবং অনেকেই এটি প্রদর্শন করেছেন।
ফিলাকলবর্ন


5

আইপিথন আশ্চর্যজনকভাবে ব্যবহার করা সুবিধাজনক।

স্ট্যান্ডার্ড শেল বৈশিষ্ট্য: জব কন্ট্রোল, রিডলাইন এডিটিং এবং হিস্ট্রি, এলিয়াস, cat ls cdএবং pwdপেজার ইন্টিগ্রেশন, যেকোন সিস্টেম কমান্ডকে প্রিফিক্স করে !বা সক্রিয় করে চালানো %rehashx, পাইথন ভেরিয়েবলের জন্য নির্ধারিত কমান্ড আউটপুট, শেল ভেরিয়েবল হিসাবে অজগর মানগুলি উপলব্ধ values

পাইথন-সুনির্দিষ্ট: শেষ কমান্ডগুলি থেকে ফলাফল পুনরায় ব্যবহার করা, ডকুমেন্টেশন এবং উত্সে দ্রুত অ্যাক্সেস, মডিউল পুনরায় লোডিং, ডিবাগার। কিছু ক্লাস্টার সমর্থন যদি আপনি এটির মধ্যে থাকেন।

এটি বলেছিল, জটিল পাইপগুলি পাইথনে চালানো হয় না; আপনি মানগুলি পাস করার জন্য কিছু আঠালো দিয়েও পক্সিক্স শেলটি ব্যবহার করবেন।


2

পার্লের উপর ভিত্তি করে রুবি এবং পিএসএস ব্যবহার করে এমন রাশ রয়েছে ।


রাশের ওয়েবসাইট আর লাইভ নেই। এখানে একটি সংরক্ষণাগারিত সংস্করণ , এবং এখানে গিথুব রেপো । দৃশ্যত প্রকল্পটি এখানে পুনর্জীবিত হয়েছিল ( ব্লগ পোস্ট )।
ওয়াল্ডরিয়াস

2

jq এই ধরণের অবজেক্ট-ভিত্তিক স্তর হিসাবে বেশ ভাল কাজ করে।


2

এটি ব্যবহার এবং সেট আপ করা কিছুটা সহজ, এর নামকরণ করা হয়েছে ইত্যাদি ইত্যাদি https://github.com/uudruid74/bashTheObjects

আমি আমার উত্তরটি একটি উদাহরণ দিয়ে আপডেট করছি, যা অন্য উত্তরের জন্য দেওয়া একটি মৌলিক উদাহরণ অনুসরণ করে তবে এই বাক্য গঠন সহ। উদাহরণস্বরূপ প্রোগ্রামটি একই রকম, তবে আপনাকে ক্লাসের নাম সহ সমস্ত ভেরিয়েবলের উপসর্গ করতে হবে না (এটি এ ধরনের পদ্ধতি ব্যবহারের পদ্ধতি হিসাবে জানে ) এবং আমার মনে হয় বাক্য গঠনটি আরও সহজ!

প্রথমত, একটি শ্রেণীর ফাইল। উদাহরণস্বরূপ ভেরিয়েবলের জন্য ডিফল্টগুলি alচ্ছিক এবং শুধুমাত্র তখনই ব্যবহার করা হয় যদি আপনি এই মানগুলি কনস্ট্রাক্টারে পাস না করেন।

class Person
    public show
    public set
    public Name
    public Age
    public Sex
    inst var Name "Saranyan"
    inst var Age 10
    inst var Sex "Male"

Person::Person { :; }
Person::set() { :; }
Person::Name() { println $Name }
Person::Age() { println $Age }
Person::Sex() { println $Sex }
Person::show() {
    Person::Name
    Person::Age
    Person::Sex
}

এখন উদাহরণস্বরূপ ব্যবহার:

#!/bin/bash
source static/oop.lib.sh

import Person

new Person Christy Name:"Christy" Age:21 Sex:"female"
new Person Evan Name:"Evan" Age:41 Sex:"male"

println "$(Evan.Name) is a $(Evan.Sex) aged $(Evan.Age)"
println "$(Christy.Name) is a $(Christy.Sex) aged $(Christy.Age)"
println "Stats for Evan ..."
Evan.show

assert 'kindof Person Evan'
assert '[ $Evan = $Evan ]'
assert 'kindof Person Christy'
assert '[ $Evan = $Christy ]'

নোট:

  1. যে শেষ দৃser়তা ব্যর্থ হবে। উপরের উদাহরণ থেকে ভিন্ন, গ্রন্থাগারটি এখনও অবজেক্ট অ্যাসাইনমেন্ট সমর্থন করে না, তবে এটি যুক্ত করা খুব কঠিন হবে না। আমি আসন্ন ধারক / পুনরাবৃত্তি সমর্থন সহ এটি আমার টু-ডি-তে রাখব।

ইম্পোর্ট বিবৃতিটি টেকনিক্যালি প্রয়োজন হয় না, কিন্তু এটা পরিবর্তে প্রথম জন্য অপেক্ষা করার নির্দিষ্ট বিন্দুতে বর্গ লোড বাধ্য করে নতুন , যা সঠিক অনুক্রমে আরম্ভ জিনিষ সাহায্য করতে পারেন। আপনি যে একসাথে একাধিক উদাহরণ ভেরিয়েবল সেট করতে পারবেন সেই নোটটি নোট করুন।

এছাড়াও ডিবাগ স্তর, কনস্ট্রাক্টর, ডিস্ট্রাক্টর, সাবক্লাসিং এবং একটি বেসিক রিফ্লেকশন সিস্টেম রয়েছে এবং ইকো প্রতিস্থাপনের জন্য মুদ্রণ / মুদ্রণফলক দেখানো হয়েছে (কোনও ড্যাশ দিয়ে শুরু হওয়া কোনও ভেরিয়েবল মুদ্রণের চেষ্টা করবেন?)। গিথুবের উদাহরণ এটি দেখায় যে এটি ক্লাস থেকে এইচটিএমএল তৈরির কোনও সিজিআই হিসাবে চলছে।

লাইব্রেরি নিজেই (oop.lib.sh) এত সহজ নয় (400+ লাইন, 11 কে), তবে আপনি কেবল এটি অন্তর্ভুক্ত করুন এবং এটি ভুলে যান।


2

আপনি এখন লিনাক্সে পাওয়ারশেল কোর সংস্করণ ইনস্টল করতে পারেন । এটি ক্রস প্ল্যাটফর্মের উপর সঞ্চালিত হয়। নেট কোর ফ্রেমওয়ার্ক যা সক্রিয়ভাবে মাইক্রোসফ্ট দ্বারা বিকাশ করা হচ্ছে।


1

যদি কেউ সত্যিকারের সাধারণ কাঠামোর চেয়ে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (বৈশিষ্ট্য এবং পদ্ধতি) কেবলমাত্র বেসিকগুলি চায় তবে এটি কৌশলটি করবে।

ধরা যাক আপনি অবজেক্টগুলি ব্যবহার করে "হ্যালো ওয়ার্ল্ড" পাঠ্যটি প্রদর্শন করতে চান। প্রথমে আপনি একটি অবজেক্ট ক্লাস তৈরি করুন যার পাঠ্যটি প্রদর্শিত হওয়ার জন্য একটি সম্পত্তি রয়েছে এবং এই পাঠ্যটি সেট করে প্রদর্শন করার জন্য কিছু পদ্ধতি রয়েছে। কোনও শ্রেণীর একাধিক উদাহরণ একসাথে কীভাবে কাজ করতে পারে তা দেখানোর জন্য আমি পাঠ্যটি প্রদর্শনের জন্য দুটি পদ্ধতি যুক্ত করেছি: একটিতে শেষে নিউলাইন এবং একটি ছাড়া এটি।

শ্রেণীর সংজ্ঞা ফাইল: ইকো ক্লাস.ক্লাস

# Define properties
<<InstanceName>>_EchoString="Default text for <<InstanceName>>"

# Define methods
function <<InstanceName>>_SetEchoString()
{
  <<InstanceName>>_EchoString=$1
}

function <<InstanceName>>_Echo()
{
  # The -ne parameter tells echo not to add a NewLine at the end (No Enter)
  echo -ne "$<<InstanceName>>_EchoString"
}

function <<InstanceName>>_EchoNL()
{
  echo "$<<InstanceName>>_EchoString"
}

দয়া করে "<<InstanceName>>" শব্দটি নোট করুন। শ্রেণিক অবজেক্টের একাধিক উদাহরণ তৈরি করতে এটি পরে প্রতিস্থাপন করা হবে। আপনি কোনও অবজেক্টের উদাহরণ ব্যবহার করার আগে আপনার এমন একটি ফাংশন প্রয়োজন যা এটি এটি তৈরি করে। জিনিসগুলি সহজ রাখার জন্য এটি একটি পৃথক স্ক্রিপ্ট হবে যার নাম হবে: অবজেক্টফ্রেমওয়ার্ক.লিব

# 1st parameter : object instance name
# 2nd parameter : object instance class

function CreateObject()
{
  local InstanceName=$1
  local ObjectClass=$2
  # We will replace all occurences of the text "<<InstanceName>>" in the class file 
  # to the value of the InstanceName variable and store it in a temporary file
  local SedString='s/<<InstanceName>>/'$InstanceName'/g '$ObjectClass'.class'
  local TmpFile=$ObjectClass'_'$InstanceName'.tmp'
  sed $SedString > $TmpFile

  # The file will contain code which defines variables (properties) and functions (methods)
  # with the name we gave to our object instance via the 1st parameter of this function
  # ... we run this code so the variables and functions are actually defined in runtime
  source "$TmpFile"

  # Than remove the temp file as we don't need it any more
  rm "$TmpFile"
}

সুতরাং এখন আমাদের কাছে একটি শ্রেণি সংজ্ঞা ফাইল এবং একটি ক্রিয়েওবজেক্ট ফাংশন রয়েছে যা "<<InstanceName>>" পাঠ্য সহ এই ফাইলটির অনুলিপি তৈরি করে আমরা যে নামটি চাই তা প্রতিস্থাপন করে।

আসুন: হ্যালো ওয়ার্ল্ড.শ নামে পরিচিত একটি স্ক্রিপ্টে আমাদের নতুন অবজেক্টটি ব্যবহার করুন (দয়া করে মনে রাখবেন যে হ্যালো ওয়ার্ল্ড.শ কার্যকর করা উচিত should অন্য দুটি ফাইলের দরকার নেই)

# Define the CreateObject function via the lib file we created
source ObjectFramework.lib

# Create two instances of the EchoClass class
CreateObject MyHello EchoClass
CreateObject MyWorld EchoClass

# Call the SetEchoString method of the two objects. In reality these are 
# just two identical functions named differently and setting different
# variables (remember the <<InstanceName>>_EchoString variable?)
MyHello_SetEchoString "Hello "
MyWorld_SetEchoString "World"

# Finally we call the Echo and EchoNL (NewLine) methods
MyHello_Echo
MyWorld_EchoNL

হ্যালো ওয়ার্ল্ড.শ স্ক্রিপ্টটি চালিয়ে এটি "হ্যালো ওয়ার্ল্ড" (এবং একটি নিউলাইন যুক্ত করে) পাঠ্যটি প্রদর্শন করে। কেউ এই ফলাফল দ্বারা খুব বেশি প্রভাবিত হবে না, তবে আমরা জানব যে এটি দেখতে এতটা সহজ নয় :)

শুভ কোডিং!


সহজ জিনিসকে জটিল করার চেয়ে জটিল জিনিসকে সহজ করা ভাল।
ওয়াইল্ডকার্ড

1

এটি পাইথন ভিত্তিক একটি অবজেক্ট ওরিয়েন্টেড শেল, তবে এটিতে গোলংয়ের সিনট্যাক্স ঘনিষ্ঠতা রয়েছে: https://github.com/alexst07/shell-plus-plus

উদাহরণস্বরূপ, ধরার চেষ্টা করুন:

try {
  git clone git@github.com:alexst07/shell-plus-plus.git
} catch InvalidCmdException as ex {
  print("git not installed [msg: ", ex, "]")
}

ক্লাস এবং অপারেটর ওভারলোড:

class Complex {
  func __init__(r, i) {
    this.r = r
    this.i = i
  }

  func __add__(n) {
    return Complex(n.r + this.r, n.i + this.i)
  }

  func __sub__(n) {
    return Complex(n.r - this.r, n.i - this.i)
  }

  func __print__() {
    return string(this.r) + " + " + string(this.i) + "i"
  }
}

c1 = Complex(2, 3)
c2 = Complex(1, 2)
c = c1 + c2

print(c)

এবং আপনি একই আদেশ ব্যবহার করতে পারেন:

echo "Test" | cat # simple pipeline
ls src* | grep -e "test" # using glob

# using variables content as command
cip = "ipconfig"
cgrep = ["grep", "-e", "10\..*"]
${cip} | $@{cgrep} # pass an array to command

0

এখন, আপনি বেশিরভাগ সময় কোন জিনিসগুলির সাথে শেল নিয়ে কাজ করছেন? এটি ফাইল / ডিরেক্টরি, প্রক্রিয়া এবং তাদের মিথস্ক্রিয়া। সুতরাং এটি পছন্দ করা উচিত f1.editবা মত কিছু currentFile=f1.c ; .edit ; .compile ; .run। বা d1.search(filename='*.c' string='int \*')। অথবা p1.stop, p1.bg। এটি একটি ওশেলের সম্পর্কে আমার বোঝা।


0
## implemantion of base class
function Class()
{
    base=${FUNCNAME}
    this=${1}
    Class_setCUUID $this
    for method in $(compgen -A function)
    do
        export ${method/#$base\_/$this\_}="${method} ${this}"
    done

}

function copyCUUID()
{
        export ${2}_CUUID=$(echo $(eval "echo \$${1}_CUUID"))

}

function Class_setCUUID()
{
        export ${1}_CUUID=$(uuid)
}

function Class_getCUUID()
{
        echo $(eval "echo \$${2}_CUUID")
}


function Class_setProperty()
{
        export ${1}_${2}=${3}
}

function Class_getProperty()
{
        echo $(eval "echo \$${1}_${2}")
}

function Class_Method()
{
        echo "function ${1}_${2}()
        {
        echo null
        }
        " > /tmp/t.func
        . /tmp/t.func
        rm /tmp/t.func


}

function Class_setMethod()
{
        export ${1}_${2}=${1}_${2}
}


function Class_getMethod()
{
        $(eval "echo \$${1}_${2}")
}


function Class_equals()
{
        base="Class"
        this=${2}

    copyCUUID ${1} ${2}
    for method in $(compgen -A function)
    do
        export ${method/#$base\_/$this\_}="${method} ${1}"
    done


}

কেবলমাত্র http://hiersayanx.blogspot.in/2012/12/object-oriented-programming-in-bash.html- এর উপর ভিত্তি করে ব্যাশের কাছে ও-ধারণাগুলি প্রবর্তন করার চেষ্টা করা হয়েছে

source ./oobash

Class person
$person_setProperty Name "Saranyan"
$person_setProperty Age 10
$person_setProperty Sex "Male"
function person_show()
{
$person_getProperty Name
$person_getProperty Age
$person_getProperty Sex
}
$person_setMethod show

$person_equals person1
$person1_getMethod show
$person1_equals person3
$person_getCUUID person
$person_getCUUID person1
$person_getCUUID person3

0

সংক্ষিপ্ত জবাবের জন্য দুঃখিত তবে এখানে যায়।

হিপসায়ানেক্স বাশ-তে একটি নিবন্ধ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং তৈরি করেছে । মূলত তিনি হাই-jacked $FUNCNAME, function, compgen, এবং exportঘনিষ্ঠ হিসাবে তৈরি করতে এক ব্যাশ পেতে পারেন গলি করতে।

দুর্দান্ত অংশটি হ'ল এটি ভালভাবে কাজ করে এবং একটি শ্রেণি তৈরির জন্য কেবল কয়েক লাইনের বয়লারপ্লাইটিংয়ের প্রয়োজন।

প্রয়োজনীয় প্রাথমিক অংশগুলি হ'ল:

ClassName() {
# A pointer to this Class. (2)
base=$FUNCNAME
this=$1

# Inherited classes (optional).
export ${this}_inherits="Class1 Class2 Class3" # (3.1)
 for class in $(eval "echo \$${this}_inherits")
do
    for property in $(compgen -A variable ${class}_)
    do
        export ${property/#$class\_/$this\_}="${property}" # (3.2)
    done

    for method in $(compgen -A function ${class}_)
    do
        export ${method/#$class\_/$this\_}="${method} ${this}"
    done
done

# Declare Properties.
export ${this}_x=$2
export ${this}_y=$3
export ${this}_z=$4

# Declare methods.
for method in $(compgen -A function); do
    export ${method/#$base\_/$this\_}="${method} ${this}"
done
}

function ClassName_MethodName()
{
#base is where the magic happens, its what holds the class name
base=$(expr "$FUNCNAME" : '\([a-zA-Z][a-zA-Z0-9]*\)')
this=$1

x=$(eval "echo \$${this}_x")

echo "$this ($x)"
}

ব্যবহার:

# Create a new Class Instance
ClassName 'instanceName' $param1 $param2

$instanceName_method

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

পার্ল, রুবি এবং পাইথনের মতো গুরুতর ওওপি স্ক্রিপ্টিং ভাষা ব্যবহার করা আপনার প্রকল্পের পক্ষে আরও উপযুক্ত suited তবে আমার সত্যবাদী বিকল্পে বাশে ওওপি-র এই পদ্ধতিটি ব্যবহার করতে মডিউলার ব্যাশ স্ক্রিপ্টগুলি বজায় রাখার সময় এবং প্রচেষ্টার পক্ষে মূল্য রয়েছে।


0

আমি গিটহাবের উপর একটি ফাংশন বিকাশ করছি যা হ্যাশম্যাপ অবজেক্ট , শেল_ম্যাপের মতো কাজ করে ।

" হ্যাশম্যাপ দৃষ্টান্তগুলি " তৈরি করতে এই ফাংশনটি বিভিন্ন নামে নিজের অনুলিপি তৈরি করতে সক্ষম। প্রতিটি নতুন ফাংশন অনুলিপি একটি পৃথক $ FUNCNAME পরিবর্তনশীল থাকবে। $ FUNCNAME এর পরে প্রতিটি মানচিত্রের উদাহরণস্বরূপ একটি নেমস্পেস তৈরি করতে ব্যবহৃত হয়।

মানচিত্র কীগুলি বিশ্বব্যাপী পরিবর্তনশীল $ FUNCNAME_DATA_ $ KEY আকারে, যেখানে $ KEY মানচিত্রে যুক্ত হওয়া কী। এই ভেরিয়েবলগুলি ডায়নামিক ভেরিয়েবল

বেলো আমি এর একটি সরলীকৃত সংস্করণ রাখব যাতে আপনি উদাহরণ হিসাবে ব্যবহার করতে পারেন।

#!/bin/bash

shell_map () {
    local METHOD="$1"

    case $METHOD in
    new)
        local NEW_MAP="$2"

        # loads shell_map function declaration
        test -n "$(declare -f shell_map)" || return

        # declares in the Global Scope a copy of shell_map, under a new name.
        eval "${_/shell_map/$2}"
    ;;
    put)
        local KEY="$2"  
        local VALUE="$3"

        # declares a variable in the global scope
        eval ${FUNCNAME}_DATA_${KEY}='$VALUE'
    ;;
    get)
        local KEY="$2"
        local VALUE="${FUNCNAME}_DATA_${KEY}"
        echo "${!VALUE}"
    ;;
    keys)
        declare | grep -Po "(?<=${FUNCNAME}_DATA_)\w+((?=\=))"
    ;;
    name)
        echo $FUNCNAME
    ;;
    contains_key)
        local KEY="$2"
        compgen -v ${FUNCNAME}_DATA_${KEY} > /dev/null && return 0 || return 1
    ;;
    clear_all)
        while read var; do  
            unset $var
        done < <(compgen -v ${FUNCNAME}_DATA_)
    ;;
    remove)
        local KEY="$2"
        unset ${FUNCNAME}_DATA_${KEY}
    ;;
    size)
        compgen -v ${FUNCNAME}_DATA_${KEY} | wc -l
    ;;
    *)
        echo "unsupported operation '$1'."
        return 1
    ;;
    esac
}

ব্যবহার:

shell_map new credit
credit put Mary 100
credit put John 200
for customer in `credit keys`; do 
    value=`credit get $customer`       
    echo "customer $customer has $value"
done
credit contains "Mary" && echo "Mary has credit!"

আপনি কমান্ড প্রতিস্থাপন কীভাবে কাজ করে তা ভুল বুঝে দেখেছেন। এটি ব্যাকটিক্সের মধ্যে থাকা কমান্ডের আউটপুট দ্বারা প্রতিস্থাপিত হয়, রিটার্নের স্থিতির সাথে প্রতিস্থাপন করা হয় না । অন্য কথায় আপনার কোড আপনি যা ভাবেন তা করে না।
ওয়াইল্ডকার্ড

আহা। আপনি সঠিক. আমার ক্ষমা। তবে এর carp "Some error message"; returnপরিবর্তে এটি ব্যবহার করা আরও পরিষ্কার হবে।
ওয়াইল্ডকার্ড

অথবা [ -z "$KEY" ] && { carp "some message"; return;} সাবসেলের দরকার নেই। তবে বাস্তবে এটি কোনও if ... elif ... elif ... else ... fiনির্মাণের জন্য প্রকৃত প্রার্থীর মতো দেখাচ্ছে - যা প্রায়শই সেরা পছন্দ নয়, তবে সম্ভবত এটি এখানে is :) (অথবা হতে পারে কেস স্যুইচ))
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড আমি উত্তরটি সম্পাদনা করেছি। এখন কার্প এবং ব্যাকটিক্স সম্পর্কে আমাদের আলোচনাটি কোনও অর্থহীন নয়। আসুন এই কথোপকথনটি মুছবেন?
ব্রুনো নেগ্রো জিকা

0

প্লাম্বাম একটি পাইথনের মতো শেল ভাষা। এটি পাইথনের সাথে সিনট্যাক্সের মতো শেল প্যাকেজ করে অভিজ্ঞতাটিকে বস্তু-ভিত্তিক করে তোলে।

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