কোন কার্যক্ষম মত ইউনিক্স শেল আছে?


18

আমি (সত্যই) ফাংশনাল প্রোগ্রামিংয়ের নবাগত (বাস্তবে পাইথন ব্যবহার করে এটির সাথে কেবল যোগাযোগ ছিল) তবে শেল পরিবেশে কিছু তালিকা-নিবিড় কাজের জন্য এটি একটি ভাল পদ্ধতির বলে মনে হয়।

আমি এই জাতীয় কিছু করতে চাই:

$ [ git clone $host/$repo for repo in repo1 repo2 repo3 ]

এই জাতীয় বৈশিষ্ট্য সহ কোনও ইউনিক্স শেল রয়েছে? অথবা পাইথনের অভ্যন্তর থেকে সহজে শেল অ্যাক্সেসের (কমান্ড, এনভি / ভার্স, রিডলাইন, ইত্যাদি ...) অনুমতি দেওয়ার জন্য কিছু বৈশিষ্ট্য রয়েছে (বাশের প্রতিস্থাপন হিসাবে পাইথনের ইন্টারেক্টিভ ইন্টারপ্রেটার ব্যবহার করা ধারণা)।

সম্পাদনা করুন:

হতে পারে একটি তুলনামূলক উদাহরণ স্পষ্ট হবে। ধরা যাক আমার কাছে দির / ফাইলের সমন্বয়ে একটি তালিকা রয়েছে :

$ FILES=( build/project.rpm build/project.src.rpm )

এবং আমি সত্যিই একটি সহজ কাজটি করতে চাই: সমস্ত ফাইলকে ডিস্ট / এন্ড সিস্টেমে ইনস্টল করতে অনুলিপি করুন (এটি একটি বিল্ড প্রক্রিয়ার অংশ):

ব্যাশ ব্যবহার:

$ সিপি $ {ফাইলগুলি [*]} দ্য ডিস /
d সিডি ডিস অ্যান্ড & আরপিএম-উভ $ (in {ফাইলের জন্য [*]}; বেস নাম $ চ; সম্পন্ন))

একটি "পাইথোনিক শেল" পদ্ধতির ব্যবহার (সতর্কতা: এটি কাল্পনিক কোড):

ফাইলের ফাইলের জন্য সিপি [os.path.join ('dist', os.path.basename (ফাইল))] 'ডিস্ট'

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

এবং একটি সত্যই, সত্যই, গুরুত্বপূর্ণ বিষয়: সিন্ট্যাক্স / সরঞ্জাম / বৈশিষ্ট্যগুলি প্রত্যেকেই ইতিমধ্যে জানে: শে এবং পাইথন using

আইপিথনগুলি একটি ভাল দিক হতে পারে তবে এটি ফুলে যায়: যদি বর্ণের নাম '$' দিয়ে শুরু হয়, এটি এটি করে, যদি '$$' এটি করে। এটি সিনট্যাক্সটি "প্রাকৃতিক" নয়, এতগুলি বিধি এবং "ওয়ার্কআরউন্ডস" ( [ ln.upper() for ln in !ls ] -> সিনট্যাক্স ত্রুটি)


কিছুটা সম্পর্কিত: github.com/amoffat/pbs
জোশ লি


4
ফাংশনাল প্রোগ্রামিংয়ের তালিকান উপলব্ধির চেয়ে আরও কিছু আছে। যদি আপনার মূল ফোকাসটি ফাংশনাল কোড লিখতে থাকে তবে আমি অজগরটিকে উদাহরণ হিসাবে নেব না।
pqnet

উত্তর:


10

এখানে একটি স্কিম শেল রয়েছে যা সম্ভবত আপনি যা খুঁজছেন তার খুব কাছাকাছি। আমি নিজে এটি ব্যবহার করিনি।

হালনাগাদ :

আমি কেবল এটি ইনস্টল করেছি এবং চেষ্টা করেছি। দেখা যাচ্ছে যে স্ক্যাশ সত্যই দরকারী ইন্টারেক্টিভ শেলের চেয়ে ইন্টারেক্টিভ স্কিম ইন্টারপ্রেটার এবং স্ক্রিপ্টিং ভাষা। আপনি শুধু টাইপ করতে পারবেন না

echo hello

বাক্য গঠনটি প্রদর্শিত হবে

(run (echo hello))

এবং এটি পেতে গুগলিংয়ের কয়েক মিনিট সময় লেগেছে। প্রথম উদাহরণ এখানে হল:

gunzip < paper.tex.gz | detex | spell | lpr -Ppulp &

যা অনুবাদ করে:

(& (| (gunzip) (detex) (spell) (lpr -Ppulp)) (< paper.tex.gz))

তবে এটি আপনাকে কীভাবে একটি সহজ শেল কমান্ড চালাতে হবে তা বলে না ।

এই FAQ এন্ট্রি বলে:

4.6 আমি স্ক্র্যাচকে ইন্টারেক্টিভ শেল হিসাবে ব্যবহার করতে পারি?

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

এই সমস্যাগুলি দূর করার জন্য, মার্টিন গ্যাসবিচলার এবং এরিক নওল কমান্ডার এস লিখেছেন, যা স্ক্যাসের শীর্ষে চলে এবং একটি আরামদায়ক ইন্টারেক্টিভ পরিবেশ সরবরাহ করে। এর অভিনব বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল এটি অনেকগুলি ইউনিক্স কমান্ডের আউটপুট বুঝতে পারে এবং ব্যবহারকারীর এটি কার্যকর উপায়ে ব্রাউজ এবং পরিচালনা করতে দেয়। কমান্ডার এস সম্পর্কে আরও তথ্য এটি বর্ণিত কাগজে পাওয়া যাবে: http://www.deinprogramm.de/scheme-2005/05-knauel/05-knauel.pdf কমান্ডার এস কীভাবে প্রাপ্ত এবং ইনস্টল করবেন সে সম্পর্কে নির্দেশাবলী পাওয়া যায় স্ক্যাশ ওয়েবসাইট: http://www.scsh.net/resources/commander-s.html

সুতরাং সম্ভবত এটিই আসল উত্তর।


7

প্রশ্নের সরাসরি উত্তর দেওয়ার বিভাগে, ইএস শেলটি রয়েছে যা বাশ এবং জেডএস ইত্যাদির জন্য কার্যকরী প্রতিস্থাপন হিসাবে উদ্দিষ্ট is

দ্বিতীয়ত, আপনাকে আরও কার্যকরী স্ট্যান্ডার্ড শেল লিখতে সহায়তা করার বিভাগে পাইপমিল কৌশল শেখার বিষয়টি বিবেচনা করুন:

who | while read username 
do
  cat <<EOF | grep $username
nic
mark
norman
keith
EOF
done | while read username
do
  echo "you have an answer on superuser.com" | mail -s "well done" $username
done

প্রথম যখন লুপটি কার্যকরী হয় keep(লুপ থেকে বেরিয়ে আসা কেবল নন-নাল মানকেই পাস করুন) এবং দ্বিতীয়টি হ'ল each(কেবলমাত্র পার্শ্বপ্রতিক্রিয়ার মানচিত্র)।

শেল এফপি করার জন্য এটি একটি দুর্দান্ত উত্সাহ।

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


6

মান বোর্ন ধাঁচের শাঁস ( sh, bash, ksh, ইত্যাদি) ইতিমধ্যেই আপনি না দেওয়া:

for repo in repo1 repo2 repo3 ; do git clone $host/$repo ; done

(পূর্বে doএবং সেমিকোলনের প্রয়োজনীয়তার জন্য নোট করুন done)) অতিরিক্তভাবে bashএবং অন্যান্য শেলগুলি, $repoকমান্ডে একবারে উপস্থিত হলে আপনি লিখতে পারেন:

git clone $host/{repo1,repo2,repo3}

অবশ্যই, এবং আমি এটি অনেক ব্যবহার করি। তবে ল্যাম্বদা ফাংশনগুলির মতো অন্যান্য জিনিসগুলির কী হবে?

8
git clone $host/{repo1,repo2,repo3}forলুপ হিসাবে একই জিনিস না ; এটি git cloneএকবার তিনটি যুক্তি দিয়ে আহ্বান জানায় । মূলত একই জিনিসটি ঘটে তা হ'ল কীভাবে git cloneকাজ করে তার একটি নিদর্শন ; এটি অগত্যা অন্যান্য আদেশের ক্ষেত্রে প্রযোজ্য নয়। (তুলনা echo foo bar bazকরতে echo foo; echo bar; echo baz, উদাহরণস্বরূপ।)
কিথ থম্পসন

@ কারুচিও আপনি ল্যাম্বদা FUN=eval 'git clone '"$host"'$0 সংজ্ঞা হিসাবে ব্যবহার করতে পারেনfor repo in repo{1,2,3} ; do $FUN $repo ; done
pqnet

সবচেয়ে বড় সমস্যাটি হ'ল ইউনিক্স সরঞ্জামগুলিতে প্রায়শই পার্শ্ব প্রতিক্রিয়া থাকে (ফাইলগুলিতে লেখার মতো), তাই আপনি প্রায়শই সেগুলি রচনা করতে পারবেন না যেমন আপনি কার্যকরী ভাষায় করতে চান।
weberc2

2

স্কিম শেল, স্ক্যাশ, সত্যিই ভাল।

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

স্ক্যাশ খুব কমপ্যাক্ট নয় (ব্রেভিটি শক্তি ও পারিবারিক ভাষার দুর্বলতা উভয়ই) তবে এটি শক্তিশালী।

এটি ছোট এবং বৃহত্তর কাজের জন্য দরকারী এবং ব্যবহারিক, স্ক্যাস ঘটনাক্রমে স্কিমটি আঁকড়ে ধরার একটি ভাল উপায় (যদিও এটি যদি আপনার লক্ষ্য হয়ে থাকে তবে আপনিও সম্ভবত সোজা র‌্যাকেটে যেতে পারেন, আজকাল)।

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

কোনও শব্দের অর্থবোধ নেই যার মধ্যে শ-শৈলীর শাঁসগুলি কার্যকরী এবং পাইথন কেবলমাত্র প্রান্তিক অর্থে ক্রিয়ামূলক যে এটিতে ল্যাম্বদা ফাংশন রয়েছে।


2

শেলগুলি অগত্যা চূড়ান্তভাবে উদ্ভাসিত হয় যার অর্থ আপনি কম লাইন, টোকেন ইত্যাদি দিয়ে প্রচুর অর্জন করেন meaning

আমরা সাধারণত ভাষাগুলি একটি বিশেষ উদ্দেশ্যে যেমন শেল বা ডিএসএল, আর, ম্যাপেল ইত্যাদির জন্য তাদের ডিজাইন করে ভাব প্রকাশ করি এবং আপনি সি, সি ++, জাভা ইত্যাদির মতো বেশিরভাগ সাধারণ উদ্দেশ্যে ভাষায় তুলনামূলকভাবে সামান্য ভাব প্রকাশ পান find

পাইথন, পার্ল, রুবি ইত্যাদি হ'ল সাধারন উদ্দেশ্যমূলক ভাষা যা শেল, আলা হাঁসের টাইপিংয়ের অনুরূপ আরও অভিব্যক্তিপূর্ণ। DSLs তাদের সম্মুখের ঝালাই পেতে, Ala তাই সাগে গণিত জন্য। যদিও বাস্তব শেল কমান্ডগুলির জন্য এত দুর্দান্ত নয়

সমস্ত বন্ধনীগুলির কারণে আপনি একবার DLS তৈরি করলেও স্কিমটি সেই ভাবের মতো নয়।

হাস্কেলের মতো কার্যকরী ভাষা রয়েছে তবে রয়েছে প্রচুর অভিব্যক্তি এবং ডিএসএল তৈরির দুর্দান্ত ক্ষমতা। হাসকেলে শেল তৈরির আকর্ষণীয় প্রচেষ্টা হ'ল কচ্ছপ এবং শেলী

অনুশীলনে, হাস্কেল শক্তিশালী তবে বিধিনিষেধযুক্ত টাইপ সিস্টেমের কারণে প্রচেষ্টার সরঞ্জামগুলির সাথে একটি শেখার বক্ররেখা রয়েছে তবে তারা যথেষ্ট প্রতিশ্রুতি দেখায়।


1

প্রথমত, আপনার যে "${files[@]}"কোনও জায়গা ব্যবহার করা উচিত ${files[*]}। অন্যথায় স্পেস আপনাকে অস্থির করে তুলবে।

শেলটি ইতিমধ্যে বেশ কার্যকরী; যদি আপনি লাইন টেক্সট আউটপুট হচ্ছে তালিকার পরিপ্রেক্ষিতে মনে করি, তারপর grepহয় filter, xargsহয় mapপাইপ খুব কার্যকরী হয়, ইত্যাদি।

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

আমি বুঝতে পারছি না কেন আপনাকে খুঁজে cp [ os.path.join('dist', os.path.basename(file)) for file in FILES ] 'dist'বাঞ্ছনীয় cp "${FILES[@]}" dist। পরেরটি টাইপিং অনেক কম।


0

এটা হচ্ছে "কার্মিক" সম্পর্কে জানি, কিন্তু না রয়েছে RC , যা scsh কাগজ উল্লেখ করা হয়। এটি এস এর পূর্বসূর।

লিনাক্স মিন্টে (এবং সম্ভবত ডেবিয়ান, উবুন্টু ...) দিয়ে আপনি এটি ব্যবহার করে দেখতে পারেন

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