ফাইলনামের জায়গায় ড্যাশ (-) এর ব্যবহার


110

একটি কমান্ডের জন্য, যদি -কোনও ফাইলের নামের জায়গায় একটি যুক্তি হিসাবে ব্যবহার করা হয় তার অর্থ STDIN বা STDOUT।

  1. তবে এই উদাহরণে এটি নামের সাথে একটি ফাইল তৈরি করে -:

    echo hello > -

    -এই উদাহরণটিতে আমি কীভাবে স্টটআউট বলতে পারি?

  2. বিপরীতে, আমি উদাহরণগুলিতে -নামযুক্ত কোনও ফাইলকে কীভাবে বোঝাতে পারি -:

    cat -

3
যেহেতু সরাসরি মন্তব্য করার জন্য আমার স্পষ্টতই 50 টি খ্যাতি থাকতে হবে ... / dev / stdin / dev / stdout মন্তব্যে, AIX, যা একটি বৈধ UNIX ডেরিভেটিভ, এই সিউডোডিসগুলি নেই। এবং, আরও একটি মন্তব্য হিসাবে, লিনাক্স কোনও ক্ষেত্রেই ইউনিক্স ডেরিভেটিভ নয়। এটি একটি পসিক্স-কমপ্লায়েন্ট ওয়ার্কালিকে এবং ইউনিক্স-ইশ ওএসের মধ্যে এই মুহুর্তে সর্বাধিক জনপ্রিয়, তবে কোনও ভুল করবেন না, এটি কোনও ইউনিক্স নয়। তবে, এখানে উত্তরগুলির সংক্ষিপ্ত বিবরণ সঠিক। "-" স্বরলিপিটি শেল দ্বারা বিশেষ হিসাবে ব্যাখ্যা করা যায় না এবং এভাবে প্রতিটি পৃথক প্রয়োগগুলিতে সরাসরি একটি এআরজি হিসাবে প্রেরণ করা হয়। যদি অ্যাপ্লিকেশনটি রিকগনি না করে

এছাড়াও 2>&-নির্মাণ রয়েছে, যার অর্থ "নিকট বর্ণনাকারী 2"।
user3132194

@ ইউজার 95873, আমি মনে করি আপনি যা বলতে চেয়েছিলেন তা হ'ল: লিনাক্স ইউনিক্সের মতো, যদিও প্রতিটি ইউনিক্সের মতো (বা সত্য ইউনিক্স) লিনাক্স নয় । লিনাক্স সত্য কিনা ইউনিক্স (যেমন একক ইউনিক্স স্পেসিফিকেশন মেনে চলে) এর সাথে / ডিভ / স্টডি {ইন, আউট, এরর} ইস্যুটির সম্পর্ক নেই। হিসাবে / dev / std {in, আউট, এরর} বৈশিষ্ট্য যুক্ত করা হয়েছে , অনুপস্থিত
সাশা

উত্তর:


156

-স্ট্যান্ডিন / স্টডআউট বোঝাতে ফাইলের নাম হিসাবে ব্যবহার করা একটি প্রচলন যা প্রচুর প্রোগ্রাম ব্যবহার করে। এটি ফাইলের নামের কোনও বিশেষ সম্পত্তি নয়। কার্নেলটি -বিশেষ হিসাবে চিহ্নিত করে না তাই কোনও ফাইল কল -হিসাবে ফাইলের নাম হিসাবে উল্লেখ করা কোনও সিস্টেম কল -আক্ষরিক অর্থে ফাইলের নাম হিসাবে ব্যবহার করবে ।

ব্যাশ পুনঃনির্দেশ সহ, -একটি বিশেষ ফাইল নাম হিসাবে স্বীকৃত নয়, সুতরাং বাশ এটি আক্ষরিক ফাইলের নাম হিসাবে ব্যবহার করবে।

যখন catস্ট্রিং সূচিত -একটি ফাইল যেমন, এটা stdin জন্য একটি প্রতিশব্দ হিসাবে একইরূপে। এটি পেতে, আপনাকে স্ট্রিংটি catএমনভাবে পরিবর্তন করতে হবে যা দেখতে পেল এমন একটি ফাইল যা এখনও বোঝায় -। এটি করার স্বাভাবিক উপায় হ'ল একটি ফাইল - ./-বা এর সাথে ফাইলের নাম উপসর্গ করা /home/Tim/-। এই কৌশলটি একই রকম সমস্যাগুলির জন্যও ব্যবহার করা হয় যেখানে কমান্ড লাইন অপশন ফাইলের সাথে সংঘর্ষ হয়, সুতরাং উল্লিখিত ফাইলটি কোনও প্রোগ্রামে কমান্ড লাইন বিকল্প ./-eহিসাবে উপস্থিত হয় না -e


37
এটি যোগ করার মতো /dev/stdinএবং /dev/stdoutসর্বজনীনভাবে উপলব্ধ এবং এটি -কনভেনশনটির জায়গায় ব্যবহার করা যেতে পারে ।
jmtd

এছাড়াও catমামলা, ফেরৎ ব্যবহার পরিবর্তে তালিকা যুক্তি সাহায্য করতে পারেন: cat <-; তবে একসাথে একাধিক ফাইলের সাথে একসাথে মিশানো এবং এটি মিলানো শক্ত হবে hard
jmtd

10
@jmtd: / dev / std {in, out univers সর্বজনীনভাবে উপলভ্য নয়। সব ইউনিক্সের এটি নেই।
ক্যামহ

2
আকর্ষণীয়, আমি ধরে নিয়েছিলাম যে তারা পসিক্সের অংশ (তবে নিশ্চিত করতে পারছে না)। তারা কমপক্ষে লিনাক্স, বিএসডি এবং সোলারিসে উপস্থিত রয়েছে। আপনি কি এমন আধুনিক ইউনিক্সের উদাহরণ দিতে পারেন যার অভাব রয়েছে?
jmtd

1
@ ক্যামহ নিশ্চিত নয় যে আপনি বিজ্ঞপ্তিটি পেয়েছেন কিনা, এবং এটি একটি খুব, খুব পুরানো বিষয়; আপনি পারবেন কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে আমি যদি জানতে চাই তবে আমি খুব কৌতুহলী jmtd? :)
সুইভেল

18
  1. পরিবর্তে echo hello > -, আপনি ব্যবহার করতে পারেন echo hello > /dev/stdout

    যদিও '-' একটি কনভেনশন করেছে যে এটি সমর্থন অনুপস্থিত প্রতিটি প্রোগ্রামের দ্বারা বাস্তবায়িত করা হয় /dev/stdin, /dev/stdoutএবং /dev/stderr, যখন অপারেটিং সিস্টেম (অন্তত সোলারিস, Linux এবং BSD গুলোর না) দ্বারা সমর্থিত হয় তবে আবেদনের স্বাধীন এবং তারপর আপনি যেমন কাজ করবে মনস্থ করা।


9

যেমন ক্যামের উল্লেখ করা হয়েছে , -কেবলমাত্র কিছু প্রোগ্রাম দ্বারা ব্যবহৃত একটি নামকরণের সম্মেলন। আপনি যদি শেলটি সনাক্ত করতে পারবেন এমন কোনও ফাইল বর্ণনাকারী সহ এই স্ট্রিমগুলি উল্লেখ করতে চান তবে জিলিয়াগ্রে আপনার নামটি ব্যবহার করার পরিবর্তে /dev/stdinবা /dev/stdoutতার পরিবর্তে সঠিক ছিল । এই ফাইলের নামগুলির যে কোনও জায়গায় একটি সাধারণ ফাইলের নাম কাজ করতে পারে।

  1. বলা হচ্ছে, আপনার প্রথম উদাহরণটি নির্বোধ of যে কোনও আউটপুট যে কোনও ফাইলকে লেখার জন্য পুনঃনির্দেশ অপারেটর দ্বারা ধরা পড়বে তা ইতিমধ্যে স্ট্যান্ডার্ড-আউটপুট চালু, সুতরাং এটি পুনর্নির্দেশ করা এবং এটি যেখান থেকে এসেছিল সেখানে ফিরে লিখতে পারা যায় না। আপনি যে আচরণটি সেখানে ব্যবহার করছেন তা পাইপ, পুনর্নির্দেশ নয় not

    echo hello |
  2. আপনার দ্বিতীয় উদাহরণে আপনাকে কিছুটা ইঙ্গিত দিতে হবে যে আপনি সেই নামের একটি লিটারেরাল ফাইল চান, এটি অভ্যন্তরীণ নাম নেই। আপনি ফাইলটির পাথ নির্দিষ্ট করে দিয়ে এটি সবচেয়ে সহজ করতে পারেন:

    cat ./-

6

1 হিসাবে, প্রোগ্রামটিকে সমর্থন করতে হবে। আপনি কেবল ইচ্ছামত ব্যবহার করতে পারবেন না। 2 হিসাবে, ইনপুট (যেমন, cat < -) থেকে পুনঃনির্দেশ করুন ।


1

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

সবচেয়ে ভাল উপায়:

$ echo hello > /dev/fd/1

/dev/stdout এর প্রতীকী লিঙ্ক /dev/fd/1


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