এই ব্যাশ আদেশগুলি কার্যকর করতে ক্রমটি কেন গুরুত্বপূর্ণ?


10

কিছুটা অসঙ্গতি বলে মনে হচ্ছে যা আমি ব্যাশ শেল সম্পর্কে বুঝতে সক্ষম নই।

যদি আমি কার্যকর করি:

ls;date;time

তিনটি প্রশ্নের ফলাফল ক্রমানুসারে প্রদর্শিত হয়।

তবে, বিনিময় তারিখ এবং সময় অবস্থানের সময় একটি ত্রুটি বার্তা পপ আপ হয়।

সুতরাং যদি আমি কার্যকর করি:

ls;time;date

ত্রুটি বার্তা বলেছেন: bash: syntax error near unexpected token 'date'

কেউ এই ব্যাখ্যা করতে পারেন?


আপনার সমস্যা time;dateবনাম উপর নির্ভর করে date;time। পাইপলাইনটি bashশেষ এবং timeআউটপুট দিয়ে উত্পন্ন সর্বশেষ চরটিতে এটি সমস্যা বলে মনে হচ্ছে । বিভিন্ন টার্মিনাল এমুলেটরগুলিতে পরীক্ষিত ফলাফল হ'ল : - [বাশ] $ তারিখ; সময় # [ঠিক আছে]; সময়; তারিখ # [ নোটক ] বাশ: অপ্রত্যাশিত টোকেনের নিকটে সিনট্যাক্স ত্রুটি `তারিখ '$ সময় # ত্রুটি কেবল ততই দেখা যায় না যে এটি যে কোনও তারিখের ফলাফল। - [সিএসএস] $ তারিখ; সময় # [ঠিক আছে] $ সময়; তারিখ # [ওকে] - [টিসিএসসি] $ তারিখ; সময় # [ওকে] $ সময়; তারিখ # [ঠিক আছে] - [কেএসআই] $ তারিখ; সময় # [ ঠিক আছে] $ সময়; তারিখ # [ঠিক আছে]
মোস্তফা শাহভের্দি 6'13

আমি ত্রুটি বার্তার ব্যাখ্যা সহ আমার উত্তর আপডেট করেছি। আপনি যে উত্তরটি সন্ধান করছেন এটি দয়া করে পরীক্ষা করুন।
zwets

উত্তর:


10

timeআপনার পাইপলাইন কমান্ড নয় /usr/bin/timeবাইনারি, কিন্তু ব্যাশ timeবিল্ট-ইন। man timeসঙ্গে তুলনা করুন help time। আপনি যে ত্রুটিটি দেখছেন তা ব্যাশের timeযুক্তি বিশ্লেষণ করতে ব্যর্থ is এটি অবশ্যই উপস্থিত থাকতে হবে বা একটি নতুন লাইন হতে হবে। এটি আপনার প্রথম উদাহরণে একটি নতুন লাইন তবে দ্বিতীয়টিতে অনুপস্থিত।

অন্যদিকে, যদি আপনি চালানো হয়

ls;date;'time'

অথবা

ls;'time';date

যেখানে আশেপাশের উদ্ধৃতিগুলি 'time'তার সংরক্ষিত শব্দ হিসাবে স্থিতি প্রত্যাহার করে, তারপরে বাশকে লাইনটি বিশ্লেষণ করতে কোনও সমস্যা নেই। এটি এখন একটি তালিকায় তিনটি কমান্ডকে বিশ্লেষণ করে যা এটি ক্রম অনুসারে কার্যকর /usr/bin/timeহবে এবং উভয় ক্ষেত্রেই ব্যবহারের ত্রুটির প্রতিবেদন করবে।

অভিযোজ্য বস্তু

এটি লক্ষ্য করা গেছে যে time ; dateত্রুটি উপস্থাপন করলেও time ; ; dateহয় না। সম্ভবত ব্যাখ্যাটি time ;সমান হিসাবে বাশ দ্বারা ব্যাখ্যা করা হয় time <newline>। অভিব্যক্তি time ; ; dateতাহলে তালিকা হিসাবে পার্স করা হয় time ;এবং date

এই পর্যবেক্ষণ যে সঙ্গে সামঞ্জস্যপূর্ণ time ;এবং time ; ;পাশাপাশি আইনি হয়, দ্বিতীয় Singleton তালিকা হিসাবে পার্স হচ্ছে ধারণকারী time ;ঐচ্ছিক সেমিকোলন তালিকা পর অনুমতি করে।

সুতরাং time ; dateত্রুটি কেন পাওয়া যায় তা বোঝানোর আরেকটি উপায় bash: syntax error near unexpected token 'date'হ'ল timeসেমিকোলনটি এটিকে পৃথক করে নেওয়া থেকে গ্রাস করে date। এটি কেবল এটিই করতে পারে কারণ timeবাশ সংরক্ষিত শব্দ।


একটি সুন্দর ব্যাখ্যার জন্য ধন্যবাদ! তবে তারপরে আবার এই আচরণটি আমার কাছে বাগের মতো মনে হচ্ছে: timeএকটি এনইউএলএল কমান্ডের অনুমতি দেবে বলে মনে করা হচ্ছে, এবং সেমিকোলনের তালিকাগুলি সীমিত করা timeউচিত , তাই আইএমও কমান্ডটি এর পরে সেমিকোলনটি "গ্রাস" না করা উচিত। অন্যান্য বিল্টিন কমান্ডগুলি (যা আর্গুমেন্ট নিতে পারে) এই ধরণের আচরণ প্রদর্শন করে না।
সাজান

@ অ্যারেঞ্জ জটিলতা হ'ল সময়টি নাল কমান্ডকে অনুমতি দেয় না (যা সবকিছুকে ছিন্নমূল করে দিত), এটি কেবলমাত্র আদেশের জায়গায় একটি নতুন লাইনকে অনুমতি দেয় । সুতরাং time;dateপ্রকৃতপক্ষে কোন ব্যাখ্যা ভুলভাবে ভুল। তবে time ; এবং time ; ;তারপর অবৈধ হবে। এটা তোলে বিতর্ক করা যেতে পারে কিনা time'র আচরণ একটি বাগ বা নিছক অনথিভুক্ত (এটা হল হয় অভ্যন্তরীণভাবে সামঞ্জস্যপূর্ণ), কিন্তু একটি বাগ রিপোর্ট স্পষ্টভাবে জায়গায় হবে। আপনি এটি ফাইল করতে ইচ্ছুক হবে?
zwets

ঠিক আছে, আমি উত্সটির দিকে তাকিয়েছি (bash4.2: parse.y: লাইনগুলি 1205-1221) এবং সেখানে এটি বলে যে time by itself can time a null commandএবং তারপরে এটি এটি করে $$ = make_simple_command (x, (COMMAND *)NULL);। বাগ ফাইল করার ক্ষেত্রে আমি নিশ্চিত 8)
সাজান

এই সমস্যাটি বাশ-নির্দিষ্ট বলে মনে করা উচিত। এরকম time ; dateমধ্যে কাজ ksh93এবং mkshকোন ত্রুটি যুক্ত, এমনকি যদিও ksh সেখানে timeশব্দ।
সের্গেই কোলোডিয়াজনি

2

timeকমান্ড-লাইনগুলি পার্স করার সময় বাশ বিল্ট-ইনকে একটি বিশেষ কেস হিসাবে বিবেচনা করে ।

যেমন ব্যাশ ম্যানপেজে পড়া যায়, টাইপ করা রেখাটি প্রথমে তালিকায় বিভক্ত:

pipeline ; pipeline

একটি পাইপলাইন যেখানে:

[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]

বা আমাদের ক্ষেত্রে, সহজভাবে:

time command

অর্থাত্ যদি সময় উপস্থিত থাকে তবে কমান্ডটিও উপস্থিত থাকতে হবে।

[একটি বিশেষ কেস রয়েছে যা timeএকটি নতুন লাইন অনুসরণ করার অনুমতি দেয় তবে এটি এখানে প্রয়োগ হয় না]

সুতরাং, আমাদের ক্ষেত্রে, আমাদের আছে:

time;date

দুটি পাইপলাইনে বিভক্ত:

1. time
2. date

এবং পাইপলাইন 1 ভালভাবে তৈরি হয় না, কারণ আমাদের timeকোনও আদেশ নেই। সুতরাং ত্রুটি।

নোট করুন যে কমান্ড-লাইন timeএখানে কাজ করে না:

$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]

বাশ এটিকে প্রত্যাশা অনুযায়ী 2 টি পাইপলাইনে পার্স করে:

1. /usr/bin/time
2. date

এবং /usr/bin/timeতারপরে কোনও যুক্তি ছাড়াই চালাতে অস্বীকার করে। নোট করুন যে এটি /usr/bin/timeব্যাশ থেকে কোনও ত্রুটি নয় ত্রুটি।

ব্যাক-টিক কাজ করার কারণটি হ'ল ব্যাক-টিকটি timeপাইপলাইনের মধ্যে একটি বিশেষ উপাদান হিসাবে ব্যাখ্যা করা বন্ধ করে।

অর্থাত্ ব্যাক-টিক সহ:

`time`;date

এটি দুটি পাইপলাইন হিসাবে পার্স করা হয়েছে:

1. `time`
2. date

মনে রাখবেন যে আমাদের ক্ষেত্রে পাইপলাইনটি হ'ল:

[time] command

এবং প্রাথমিকভাবে সমস্যাটি ছিল আমাদের timeকোনও আদেশ ছিল না, যা অনুমোদিত নয়। তবে এখন আমাদের কেবল কমান্ডটি রয়েছে:

`time`

পূর্ববর্তী ছাড়াই time, যেহেতু ব্যাক-টিকগুলির অর্থ timeহ'ল আদেশ হিসাবে ব্যাখ্যা করা হয়, পূর্ববর্তী শব্দ হিসাবে নয়।

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

মনে রাখবেন যে:

`time`

আসলে চালায় ফলাফলের এর timeবিল্ট-ইন, IE এটা রান যাই হোক না কেন timeবিল্ট-ইন stdout- এ তে উৎপন্ন হয়। কিন্তু যেহেতু timeনিজে থেকে স্টাডআউটকে কিছু লিখেন না, এটি কাজ করে বলে মনে হয়।

অবশেষে, এটি লক্ষ করা গেছে যে এটি কাজ করে:

time ; ; date

যা আমি ব্যাখ্যা করতে পারছি না, দুঃখের সাথে :)


আমি মনে করি আপনার ব্যাখ্যাটি আরও ভাল তবে এটি এখনও আমার কাছে অদ্ভুত দেখাচ্ছে। ;dateদেয় bash: syntax error near unexpected token ;, তবে time ;dateদেয় bash: syntax error near unexpected token date, সুতরাং মনে হয় বাশ কমান্ডটিকে "; তারিখ" হিসাবে নির্ধারিত সময়ের পরে ব্যবহার করে না। মজার বিষয়, time ; ; dateকাজ।
ব্যবস্থা করুন

হ্যাঁ, ধন্যবাদ @ আরঞ্জ, এটি বেশ অদ্ভুত। আমি উত্তরটি কিছুটা আপডেট করব।
সিডম্যাকে

ঠিক আছে, @ অ্যারেঞ্জ করুন, নতুন করে লিখেছেন। ... দীর্ঘশ্বাস থাকলেও আপনার শেষটি ব্যাখ্যা করতে পারছি না।
সিডম্যাকে

@ cdmackay আপনি ব্যাকটিক্স এবং উদ্ধৃতিগুলি মিশ্রিত করছেন। দ্বারা উদ্ধৃত 'time' এটি একটি সংরক্ষিত শব্দ হিসাবে এর অর্থ হারায়। এটিকে ব্যাকটিক করা এটিকে এমন একটি সাবশেলে সম্পাদন করে তোলে যার আউটপুট কমান্ডে বিভক্ত হয়। আলোচনার সাথে এর কোন যোগসূত্র নেই। বস্তুত, আপনার উদাহরণ `time\';dateপ্রমাণ করে আপনার দাবীর বিপরীত: এই উচিত , কারণ আপনার যুক্তি দ্বারা একটি ত্রুটি দিতে /usr/bin/timeএকটি আর্গুমেন্ট প্রয়োজন। এটির কারণটি হ'ল কারণ এটি যে সাবশেলের মাধ্যমে এটি সম্পাদন করে তা হ'ল timeআবার সংরক্ষিত শব্দ ।
zwets

@ অ্যারেঞ্জ উভয়ই সিনট্যাক্স ত্রুটি এবং উভয়ই একই জায়গার কাছে বলে জানা গেছে , সুতরাং আমি সেখানে কোনও অসঙ্গতি দেখছি না। এটি একবার সিনট্যাক্স ত্রুটির জমিতে প্রবেশ করলে আপনি কোনও পার্সার এর বেরোনোর ​​উপায় আশা করতে পারবেন না। আপনার যদি কোনও পার্সারের প্রয়োজন হয়, তবে এটি অবশ্যই আইনী বাক্য গঠনটিই নয় , প্রতিটি সম্ভাব্য অবৈধ নির্মাণের বাক্য গঠনও জানতে হবে যা সংজ্ঞা দিয়ে অসম্ভব।
zwets
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.