গর্বিত বাশ ইতিহাস


11

বাশ "গ্লোব্বিং" এবং নিয়মিত প্রকাশগুলি অভিন্ন না হওয়ার কোনও ?তিহাসিক কারণ আছে কি? উদাহরণস্বরূপ, আমি বিশ্বাস করি যে বাশের [1-2]*সাথে 1 বা 2 দিয়ে শুরু হওয়া যে কোনও কিছু মিলে যায় এবং অন্য কোনও কিছু অনুসরণ করে, যখন একটি নিয়মিত প্রকাশ হিসাবে [1-2]*কেবল 1s এবং 2 এর ক্রমটি মেলে। আমার বাশ স্ক্রিপ্টিং এবং আরজিএক্সএক্স ফু দুটোই দুর্বল এবং আমি নিয়মিত এই পার্থক্যের সাথে জড়িত সমস্যাগুলিতে যাচ্ছি যা আমাকে কৌতূহলী করে তুলেছিল যে কেন তারা আলাদা।


3
আপনি কি rm -- ^[^.].*\.txt$পরিবর্তে করছেন বিবেচনা করবেন rm -- *.txt?
স্টাফেন চেজেলাস

1
আপনার Q 'র অনেক lwn থেকে এই থ্রেড স্পর্শ করা হয়: lwn.net/Articles/96687
SLM

এমন কমান্ড রয়েছে যা ফাইলের নামগুলিতে কাজ করে এবং রিজ এক্সপ নেয়। উদাহরণস্বরূপ অনুসন্ধান করুন, find . -regex ".*\.txt$" | xargs rm --বা renameফাইলগুলির নাম পরিবর্তন করার জন্য (এটি sedফাইলের নামগুলির জন্য), সাবধান হন কিছু সিস্টেমে আলাদা থাকে rename
ctrl-alt-delor

@রিচার্ড, আমার ^[^.].*\.txt$বিন্দু ফাইলগুলি উপেক্ষা করার বিষয়টি বিবেচনা করা উচিত। নোট করুন যে এটি -regexএকটি জিএনইউ এক্সটেনশান, কিছু শেল ksh93 বা zsh এর মতো তাদের গ্লোবগুলিতে পুনরায় জড়িত করতে পারে (উদাহরণস্বরূপ চেষ্টা করুন ksh93 -c 'echo ~(E:^[^.].*\.txt$)')
স্টাফেন চেজেলাস

2
এই ব্যাশ বিদ্যমান অনুশীলনকে খুব সাবধানতার সাথে অনুসরণ করে যখন অপ্রাসঙ্গিকভাবে বেমানান পরিবর্তন এবং বর্ধনগুলি এড়িয়ে চলা এর অন্যতম বৃহত শক্তি।
ormaaj

উত্তর:


12

bash80 এর দশকের শেষদিকে kshcsh / tcsh এর কিছু ইন্টারেক্টিভ বৈশিষ্ট্যগুলির আংশিক ক্লোন হিসাবে ডিজাইন করা হয়েছিল ।

গ্লোব্বিংয়ের উত্সগুলি সেই পূর্ববর্তী শেলগুলির মধ্যে এটির উপর ভিত্তি করে খুঁজে পাওয়া উচিত।

kshনিজেই বোর্ন শেলের একটি এক্সটেনশন। বোর্ন শেল নিজেই (১৯৯৯ সালে ইউনিক্স ভি in এ প্রথম প্রকাশিত হয়েছিল) স্ক্র্যাচ থেকে একটি পরিষ্কার বাস্তবায়ন ছিল, তবে এটি থম্পসন শেল (ভি 1 -> ভি 6 এর শেল) থেকে সম্পূর্ণরূপে চলে যায় নি এবং মাশে শেল থেকে বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করেছিল।

বিশেষত, কমান্ড আর্গুমেন্টগুলি এখনও ফাঁকা দ্বারা পৃথক করা |হয়েছিল, এখন নতুন পাইপ অপারেটর ^ছিল তবে এটি বিকল্প হিসাবে সমর্থিত ছিল (এবং আপনি কেন করেন [!a-z]এবং না কেন তাও ব্যাখ্যা করে [^a-z]), $1এখনও কোনও স্ক্রিপ্টের প্রথম যুক্তি ছিল এবং ব্যাকস্ল্যাশ এখনও অব্যাহতি চরিত্র ছিল । তাই অনেকগুলি রিজেক্স এক্স অপারেটর ( ^\|$) শেলের মধ্যে তাদের নিজস্ব একটি বিশেষ অর্থ রয়েছে।

থম্পসন শেল গ্লোব্বিংয়ের জন্য একটি বাহ্যিক ইউটিলিটিতে নির্ভর করে। যখন shunquoted পাওয়া *, [বা ?কমান্ডে গুলি, এটা মাধ্যমে কমান্ড চালানো হবে glob

rm *.txt

গ্লোব চলমান শেষ হবে:

["glob", "rm", "*.txt"]

এবং গ্লোব rmসেই প্যাটার্নের সাথে মেলে এমন ফাইলগুলির তালিকার সাথে চলবে ।

grep a.\*b *.txt

globহিসাবে চালানো হবে :

["glob", "grep", "a.\252b", "*.txt"]

*উপরে যে চরিত্রে 8th বিট সেটিং প্রতিরোধ দ্বারা উদ্ধৃত হয়েছে globএকটি ওয়াইল্ড কার্ড যেমন চিকিত্সা থেকে। globতারপরে কল করার আগে সেই বিটটি সরিয়ে ফেলবে grep

Regexps সঙ্গে সমতুল্য করতে, এটি হত:

regexp rm '\.txt$'

বা:

regexp rm '^[^.].*\.txt$'

ডট-ফাইল বাদ দিতে।

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

এখন, বিভিন্ন শেল বিভিন্ন গ্লোবিং অপারেটর যুক্ত করেছে। আজকাল, ksh এবং zsh গ্লোবগুলি (এবং কিছু পরিমাণে bash -O extglobযা ksh গ্লোবগুলির একটি উপসেট প্রয়োগ করে) কার্যকরীভাবে একটি সিনট্যাক্সের সাথে regexps সমান যা ফাইলের নাম এবং বর্তমান শেল সিনট্যাক্সের সাথে কম ব্যবহারযোগ্য। উদাহরণস্বরূপ, zsh(এক্সটেনডগ্লোব এক্সটেনশন সহ), আপনি এটি করতে পারেন:

echo a#.txt

যদি তুমি চাও (অসম্ভাব্য) ফাইলের নামের যে ক্রমের গঠিত মেলে aদ্বারা অনুসরণ .txt। এর চেয়ে সহজ echo (^a*\.txt$)(এখানে শেল অপারেটরগুলি থেকে রেগেক্স অপারেটরগুলি পৃথক করার উপায় হিসাবে ব্রেসগুলি ব্যবহার করা হয়েছে যা শেলগুলি এটির সাথে মোকাবিলা করার এক উপায় হতে পারে)।

echo (foo|bar|<1-20>).(#i)mpg

এমপিজি ফাইলগুলির জন্য (কেস সংবেদনশীল) যার ভিত্তি নাম ফু, বার বা 1 থেকে 20 এর দশমিক সংখ্যা ...

ksh93এখন এটির গ্লোবগুলিতে রিজেক্সপস (বেসিক, এক্সটেন্ডেড, পার্ল-লাইক বা "অ্যাগমেন্টেড") অন্তর্ভুক্ত করতে পারে (যদিও এটি বেশ বগি) এবং এমনকি গ্লোব এবং রেজিএক্সএক্স ( printf %R, printf %P) এর মধ্যে রূপান্তর করার জন্য একটি সরঞ্জাম সরবরাহ করে :

echo ~(Ei:.*\.txt)

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


কুল রাইট আপ! আপনি আসলে ~(opt:pat)মূলধনযুক্ত বিকল্পগুলির জন্য ব্যবহার করতে পারবেন না । হতে পারে print -r -- ~(Ei).*\.txt$। প্যাটার্নটি ভিতরে রেখে দেওয়া কেবল কোনও প্যাটার্নের অংশের জন্য কোনও বিকল্প টগল না করে এড়াতে কার্যকর বলে মনে হয়। অদ্ভুতভাবে আপনি একই গ্লোবটির মধ্যে একাধিক প্যাটার্নের ভাষাগুলির সাথে মিশ্রণ করতে পারেন। ~(Ki)*.~(E)txt$সমতুল্য (শেষ পর্যন্ত সবকিছু কেবল রেজেজেমে রূপান্তরিত হয় এবং অভ্যন্তরীণভাবে লিবাস্টের রেজেক্স ইঞ্জিনে চলে যায়)।
ormaaj

@ ormaaj, ~(Ei:.*\.txt)ksh93 o + এর মতো 15 বছরের পুরানো সংস্করণ নিয়েও আমার পক্ষে কাজ করে।
স্টাফেন চেজেলাস

আমার একটি সংরক্ষিত পরীক্ষা বাইনারিগুলির সাথেও কাজ করে (2014-12-24), তবে আমি এগুলি নিয়ে সমস্যা মনে করি into জিনিসগুলি সর্বদা এলোমেলোভাবে ভাঙ্গা এবং প্রতিটি সংস্করণের মধ্যে আবার ঠিক করা হয়েছিল যখন ksh এখনও বাণিজ্যিকভাবে বিকাশ করা হয়েছিল। আমার মনে আছে প্যাটার্ন মেলানো কোডটি ভঙ্গুর অন্যতম একটি অঞ্চল।
ormaaj

@ ওর্মাজ, এর মধ্যে একটি আলাদা ~(E)xএবং ~(E:x)এটি হ'ল শেষটি নোঙ্গর করা হয়েছে ( যে xকোনও কিছুতে পূর্বের ম্যাচগুলি কেবল তখনই মেলে x), এটি আপনি যে ধরণের সমস্যার সমাধান করেছিলেন তা হতে পারে ( ~(-lr)~(E:x)অ্যাঙ্করিং অপসারণের জন্য ব্যবহার করুন , তা ~(E-lr:x)করবে না)। যাই হোক না কেন, আমি সম্মত হই এটি একেবারে বগি, এমনকি সর্বশেষ সংস্করণেও।
স্টাফেন চেজেলাস

9

ক্যালিন ১৯৫6 সালে নিয়মিত ভাষাগুলি চালু করেছিলেন। নিয়মিত প্রকাশের জন্য সেমিনাল পেপারটিতে সম্পূর্ণ আধুনিক স্বরলিপি ছিল না, তবে এটি "ক্লিন স্টার" প্রবর্তন করেছিল: A*যার অর্থ "বহু সংখ্যক পুনরাবৃত্তি A"। পরের দশকে, বিশেষত .একটি স্বেচ্ছাচারী চরিত্রের জন্য এবং এর ?অর্থ পূর্ববর্তী অক্ষরটি alচ্ছিক, এর থেকে কিছু বা কম মানক স্বীকৃতি প্রকাশিত হয়েছিল ।

globকমান্ড থেকে বাশের গ্লোব্বিং স্বরলিপিটি ১৯ 1971১ সালে ইউনিক্স ভি 1-এ ফিরে এসেছিল the সেই সময়ে, পৃথক প্রোগ্রাম দ্বারা গ্লোব্বিং করা হয়েছিল; এটি পরে শেলের মধ্যে সরানো হয়েছিল। প্রারম্ভিক globকমান্ডটির ?অর্থ "যে কোনও একটি চরিত্র" এবং "বর্ণের *কোনও ক্রম" বোঝানো উচিত। আমি জানি না কেন চরিত্রগুলি বেছে নেওয়া হয়েছিল; ?বেশ স্বজ্ঞাত, এবং *নিয়মিত প্রকাশে এটি থেকে অনুপ্রাণিত হতে পারে।

গ্লোববিং নিয়মিত মত প্রকাশের মতো সাধারণ হওয়ার কথা নয়, এবং নিয়মিত প্রকাশগুলি তখন প্রচলিত ছিল না, তাই ধারণাগুলি একত্রিত করার জন্য কোনও ডাক পড়েনি। শুরু থেকে, অন্বিত অসামঞ্জস্যপূর্ণ ছিল, সঙ্গে ?, .এবং *ফাইলের নাম ধরনে এবং নিয়মিত এক্সপ্রেশন বিভিন্ন জিনিষের অর্থ।

বাশের মতো আধুনিক শেলগুলি গ্লোব নিদর্শনগুলিতে প্রসারিত হয় তবে এটি পশ্চাদপদ সামঞ্জস্য বজায় রাখা ক্রমশ বিবর্তন ছিল। Ksh88 (1988 সংস্করণ Korn থেকে শেল ) শেল নিদর্শনের জন্য একটি বর্ধিত সিনট্যাক্স, যা স্বাভাবিক রেগুলার এক্সপ্রেশনের হিসাবে একই বাক্য গঠন হতে পারে না কিন্তু দৃঢ়ভাবে এটা দ্বারা অনুপ্রাণিত হয় চালু: *(PATTERN)এর পুনরাবৃত্তির যে কোন সংখ্যার মানে PATTERN, @(PATTERN1|PATTERN2)মানে " PATTERN1বা PATTERN2", প্রভৃতি

বাশ এর আধুনিক সংস্করণগুলি (2.02 সাল থেকে) আপনি shopt -s extglobপ্রথমে ইস্যু করলে ksh88 এর বর্ধিত নিদর্শনগুলিকে সমর্থন করে ।


বাশ কি কখনও এক্সট্লোবসকে সমর্থন করে না? আমি যতদূর সচেতন বাশ, zsh, এবং {পিডি, এম} ksh প্রথম দিন থেকেই ksh88 ম্যানুয়ালটিতে নথিভুক্ত ঠিক একই গ্লোবগুলিকে সমর্থন করেছি। আজ অবধি Ksh এর কাছে "বর্ধিত" গ্লোব কোয়ানটিফায়ারগুলি অক্ষম করার বিকল্প নেই, এবং ksh93 এর একমাত্র গুচ্ছ ksh88 যা ছিল তার বাইরে কোনও এক্সটেনশন রয়েছে।
ormaaj

2
@ormaaj Ksh88 প্রসারিত গ্লোবগুলি এবং extglobবিকল্পটি 1998 সালের কোথাও কোথাও কোথাও কোথাও চালু করা হয়েছিল Z Zsh ksh_globএকই সময়ে কোথাও 3.1 সিরিজে অর্জন করেছিল। Zsh এর নিজস্ব অনেকগুলি গ্লোববিং এক্সটেনশন রয়েছে (কিছুতে extended_globবিকল্পের প্রয়োজন হয় )।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

আমি দেখি. সুতরাং এটি কোনও বিকল্পের প্রয়োজনের ন্যায্যতা প্রমাণ করতে যথেষ্ট দেরি হয়েছিল। (আমি মনে করি ডিফল্ট বন্ধ হওয়া আজকাল অর্থহীন তবে আকর্ষণীয়))
ওড়ামাজ

1
@ormaaj, নোট করুন যে এর bashবিপরীতে kshএক্সট্লগব্যাশ ব্যাশকে নন-পসিক্সের অনুগত করে কারণ এটি ভেরিয়েবলগুলিতে অক্ষম নয়। ইন ksh, var='@(*)'; echo $varবর্তমান দির সমস্ত ফাইলের নামগুলিতে প্রসারিত হয় যা শুরু হয় @(এবং শেষ হয় )পসিক্স হিসাবে যখন bash -O extglobএটি সমস্ত ফাইলগুলিতে প্রসারিত হয় requires (তবুও, কেউ বাশ আচরণটি এখানে আরও বোধগম্য বিবেচনা করতে পারে (এবং আপনি যখন ভেরিয়েবলগুলিতে নিদর্শন রাখতে চান তবে ksh আচরণটি বেশ ব্যথা হয়))। গ্লোব সিনট্যাক্সটি (পসিক্স / বোর্নের সামঞ্জস্যতা) কারণেই এত বিশ্রী। Zsh প্রসারিত গ্লোবগুলির সাথে তুলনা করুন।
স্টাফেন চেজেলাস

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

1

Reasonতিহাসিক কারণ: হ্যাঁ। তথ্যসূত্র: http://en.wikedia.org/wiki/Glob_( প্রোগ্রামমোটিং )#
অরিগিন

কেবল বিচ্যুতি প্রদর্শন করতে এখানে একটি ভাল এবং সহজ উদাহরণ রয়েছে: a*

  • শেল গ্লোব্বিং: অর্থ হ'ল প্রথম চরিত্রটি aএবং তারপরে যাই হোক না কেন (এ, আব, আবকা ...)
  • রেজেক্স: অর্থ হল, শূন্য বা আরও বেশি চরিত্রের পুনরাবৃত্তি a(ক, আ, আ ...)

আমি সহজেই সম্মতি জানাব যে এই তাত্পর্যপূর্ণ অর্থ নতুন ব্যবহারকারীদের জন্য খুব বিভ্রান্তিকর।

গ্লোব্বিং সম্ভবত নতুনদের জন্য উপলব্ধি করা সহজ, তবে এটি কম শক্তিশালী নির্মাণও নয়।

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