কমান্ডে পাস হওয়া STDIN এবং তর্কগুলির মধ্যে পার্থক্য কী?


16

catপদ্ধতিটি কার্যকর করতে আমি উভয় ফর্মটি ব্যবহার করতে পারি :

cat file_name
cat < file_name

ফলাফল একই

তারপরে আমি manবিন্যাসে সম্পাদন করতে চাইstdin

man < file_name

যখন file_nameরয়েছে:

# file_name
cat

তবে এটি What manual page do you want?কার্যকর করার পরিবর্তে পপ আপ হয় man cat

আমি জানতে চাই কেন যুক্তি হিসাবে catগ্রহণ করতে stdinপারে তবে manপারে না। এবং কমান্ড লাইন আর্গুমেন্ট এবং এর মধ্যে পার্থক্য কি stdin?

উত্তর:


21

আপনার প্রশ্নটি কীভাবে কমান্ড লাইনে থাকা শেল আপনি ব্যবহারকারী ইনপুট ব্যবহার করছেন তার সাথে সম্পর্কিত closely

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

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

যদি আপনি বিশেষ অক্ষর যোগ <অথবা >আপনার কমান্ড লাইন, শেল dosn't পরিশেষে যোগ <এবং >অ্যারের যে প্রোগ্রাম প্রেরণ করা হবে না পরবর্তী শব্দ। সঙ্গে <বা >প্রদত্ত করতে অভিনব জিনিস শেল শুরু অন্তর্নিহিত কার্নেল (মূল শব্দ দ্বারা সমর্থিত বংশীধ্বনিতুল্য )। কী চলছে তা বোঝার জন্য আপনাকে বুঝতে হবে কী STDINএবং STDOUT(যেহেতু এটি অবিলম্বে সম্পর্কিত নয় তবে আমি বাদ দিই STDERR)।

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

শেলটি পড়লে <বা >পার্সড কমান্ড লাইনে যদি এটি সম্পর্কিত প্রোগ্রামটি চলমান হয় তবে এটি পরিচালনা করে STDINবা STDOUTকোনও বিশেষ ধরণের। STDINএবং STDOUTটার্মিনাল বা স্ট্যান্ডার্ড ইনপুট ডিভাইসটিকে আর নির্দেশ না করে বরং কমান্ড লাইনের পরবর্তী ফাইলনামের দিকে নির্দেশ করে।

দুটি লাইনের ক্ষেত্রে

cat file_name
cat < file_name

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

লাইনের অন্য ক্ষেত্রে

man < file_name

manSTDINকোনও আর্গুমেন্ট অর্থাৎ একটি খালি অ্যারে না থাকলে এটি থেকে কিছু পড়তে বোঝানো হয় না । তাই লাইন

man < file_name

সমান

man

উদাহরণস্বরূপ manকিছু থেকে পড়বে STDIN, আপনি যদি পাসও -l -করেন man। কমান্ড লাইনে প্রদত্ত এই বিকল্পের সাহায্যে আপনি আপনার টার্মিনাল manথেকে যে কোনও কিছু পড়তে পারেন display STDINসুতরাং

man -l - < file_name

এছাড়াও কাজ করবে (তবে সতর্কতা অবলম্বন manকরা কেবল পেজার নয়, তবে ফাইলের ইনপুটকেও পার্স করে এবং তাই ফাইলের সামগ্রী এবং প্রদর্শিত সামগ্রী পৃথক হতে পারে)।

সুতরাং কিভাবে STDIN, STDOUTএবং কমান্ড লাইন আর্গুমেন্ট ব্যাখ্যা করা হয় সব সংশ্লিষ্ট ডেভেলপার আপ হয়।

আমি আশা করি আমার উত্তরটি বিষয়গুলি পরিষ্কার করতে পারে।


এই বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ। শেষ কিছু অনুচ্ছেদ জন্য, আপনি ব্যবহার উল্লিখিত man -l - < file_nameকরতে manব্যাখ্যা করে STDINআর্গুমেন্ট হিসাবে, কিন্তু এটা আমার সিস্টেমের মধ্যে ব্যর্থ STDERR:man -l - < tee man: invalid option -- l man, version 1.6c
steveyang

আপনাকে স্বাগতম. কিন্তু আমি উল্লেখ না যে অন্তত আমার সংস্করণ man( মনুষ্যসৃষ্ট ডিবি ) থেকে আর্গুমেন্ট সার্চ STDINদেওয়া আর্গুমেন্ট সহ -lদ্বারা অনুসরণ -। এটি কেবল STDINম্যান পৃষ্ঠা হিসাবে ডেটা ব্যাখ্যা করে । বৈধ আর্গুমেন্ট এবং তাদের ব্যাখ্যা কীভাবে তার আরও বিশদ ব্যাখ্যার জন্য আপনাকে সম্পর্কিত প্রোগ্রামের ম্যান পেইজের সাথে পরামর্শ করতে হবে। আপনার ক্ষেত্রে পরামর্শ man man। আপনার জন্যও অনুরূপ বিকল্প রয়েছে man। আপনি যদি কোনও নির্দিষ্ট প্রোগ্রামের জন্য কমান্ড লাইন আর্গুমেন্টগুলি পড়তে চান STDIN xargs(যেমন উপরে বর্ণিত) তবে যাওয়ার উপায়।
ব্যবহারকারী 1146332

আমি man manএবং আমার OS এর মধ্যে একটি এটি সমর্থন করে না find যাইহোক, আমার জন্য এই দুটি ধারণার এই ঘোষণার জন্য ধন্যবাদ।
স্টিভিয়াং

আমি আপনার উত্তরটি সম্পাদনা করেছি যাতে এটিতে lmgtfy এর পরিবর্তে দরকারী কার্যকর লিঙ্ক থাকে। এলএমজিটিফাই লিঙ্কগুলি পোস্ট করা 1) অভদ্র, 2) অসহায় এবং 3) এসই সাইটে সত্যই ভ্রান্ত । হয় একটি লিঙ্ক সরবরাহ করুন বা না করুন তবে আপনি যদি এটি করতে চান তবে প্রকৃত তথ্যের একটি লিঙ্ক সরবরাহ করুন এবং কাউকে এটি কীভাবে সন্ধান করতে হবে তা দেখানোর ব্যঙ্গাত্মক উপায়ে নয়।
টেরডন

12

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

আপনার মনে হচ্ছে manস্ট্যান্ডিন পড়ার জন্য ম্যান পেজটি প্রদর্শন করা উচিত যা সত্যিই অদ্ভুত আচরণ হতে পারে; আপনি কখন এটি ব্যবহার করবেন? এটা সত্য যে catতার stdin প্রদর্শন সত্য যে এটা অন্য কিছুই না একজন হস্তনির্মিত বস্তু নয়; আমি মনে করি না যে অন্য কোনও সরঞ্জাম সেভাবে কাজ করে। উদাহরণস্বরূপ, grepএকটি ফাইলের নাম নিতে বা পড়তে পারে stdin, তবে এটি ডেটা প্রসেস করে stdin, এটি কোনও ফাইল নাম পড়ে না stdinএবং পরে এটি খুলতে পারে

আপনার যদি সত্যই এই আচরণের প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন xargsযা কোনও ফাইলকে কমান্ড-লাইন আর্গুমেন্টে রূপান্তর করে:

$ xargs man < file_name

বা catকলটির মধ্যে কেবল একটি কল এম্বেড manকরুন:

$ man $(cat file_name)

ব্যাশে, আপনি ব্যবহার করতে পারেন man $(<file_name)
জর্ডানম

পুনরায়: "আমি মনে করি না যে কোনও অন্য সরঞ্জাম সেভাবে কাজ করে" - পার্ল (<>)একটি লুপে STDINফাইল ফাইল হিসাবে কমান্ড-লাইন যুক্তি দেবে ...
অ্যারন ডি মারাকো

@ অ্যারোনডি.মারাসকো মানে আমার কোনও সরঞ্জামই যুক্তি নেয় না বা স্টিডিনের কাছ থেকে কোনও ফাইলের নাম পড়ে এবং সেই ফাইল থেকে যুক্তিটি
পড়বে

@ মিশেলমরোজেক এই স্পষ্টির জন্য ধন্যবাদ। আমি যে উদ্দেশ্যটি ব্যবহার করেছি তা man < file_nameহ'ল নিজেকে এই দুটি ধারণাটি বুঝতে সহায়তা করা। আপনার ব্যাখ্যার পড়া, বাস্তবায়ন কমান্ড লেখক দ্বারা সিদ্ধান্ত নেওয়া হয়। সুতরাং যদি আমি ডান অধীনে, findতর্কগুলি বরং STDIN প্রক্রিয়া করে?
স্টিভিয়াং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.