একাধিক স্ট্যান্ডার্ড ইনপুট? কিভাবে?


36

এই কমান্ডলাইনু পোস্ট থেকে :

$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)

একাধিক স্ট্যান্ডার্ড ইনপুটগুলির মতো মনে হয় তবে --- যদি আমি আমার লিনাক্স পোর্গ্রামিং কোর্সটি সঠিকভাবে মনে করি --- এটি হতে পারে না। আমি ভেবেছিলাম যে সংজ্ঞা অনুসারে, স্ট্যান্ডার্ড ইনপুটটি একটি স্ট্রিম ছিল।

সম্ভবত এই স্টিনের সাথে কি জিলচ আছে? কেউ কি এটা আমাকে ব্যাখ্যা করতে পারে; হতে পারে ডকুমেন্টেশন লিঙ্ক সরবরাহ।

বোনাস: স্ক্রিপ্ট কীভাবে এই একাধিক স্ট্রিম পরিচালনা করবে? যদি কেউ পাইথন বা পার্ল উদাহরণ সরবরাহ করতে পারে তবে এটি খুব সহায়ক।


1
ভাল প্রশ্ন. আপনি যদি অজানা থাকেন তবে একটি ইউনিক্স / লিনাক্স প্রশ্নোত্তর সাইট রয়েছে: unix.stackexchange.com
ম্যাট এলেন

2
প্রক্রিয়া বিকল্পগুলির জন্য ডকুমেন্টেশন: gnu.org/software/bash/manual/bashref.html#
গ্লেন জ্যাকম্যান

দ্রষ্টব্য: বাশে এটি <(…); Zsh প্রক্রিয়া প্রতিস্থাপন বাক্য গঠন হয় =(…)
কামিল ম্যাকিয়েরোভস্কি

উত্তর:


27

এটি একাধিক স্ট্যান্ডার্ড ইনপুট নয়। এই bash'ism যে 'প্রক্রিয়া উপকল্পন' বলা হয় http://tldp.org/LDP/abs/html/process-sub.html

এটি /dev/fd/somethingপ্রতিটি প্রতিস্থাপনের জন্য সিউডো ফাইল ( ) তৈরি করে। এটি বেশ কার্যকর। কমান্ডটি কেবলমাত্র একটি স্ট্রিম হিসাবে পড়তে পারে, যার অর্থ এটি ফিসেকের সাথে পিছনে যেতে পারে না। এটি পাইপের মতো বাইটের স্রোত হিসাবে পড়তে হবে।

বোনাস উত্তর

এটি ব্যবহার করতে আপনার খুব বেশি কিছু করার দরকার নেই। যতক্ষণ না আপনার স্ক্রিপ্ট সম্পর্কিত, এটি কমান্ড লাইনে একটি বৈধ ফাইলের নাম পায়, যা অন্য কোনও কিছুর মতো () সম্পাদনা হতে পারে। অন্যরা যেমন বলেছে, আপনি দেখতে পাবেন diff /dev/fd/XX /dev/fd/YY। আপনি যদি এই ছদ্ম ফাইলগুলির কোনওতে স্ট্যাট (() করেন, তবে আপনি এটি একটি নামযুক্ত পাইপ দেখতে পাবেন এবং আপনার এটি পাইপ শব্দার্থবিজ্ঞানের সাথে চিকিত্সা করা উচিত - যথা কোনও ফসেক () বা ftell () নয়)। যদি আপনি কোনও স্ট্যাটাস () পরীক্ষা করেন তবে এটি কোনও ফাইল (উদাঃ [ -f $1 ]) ভেঙে যাবে কিনা তা স্পষ্টভাবে দেখুন - এটি সর্বোপরি নামক পাইপ হিসাবে প্রয়োগ করা হয়।


বাশ প্রক্রিয়া প্রতিস্থাপনের জন্য আরেকটি ভাল রেফারেন্স - wiki.bash-hackers.org/syntax/expansion/proc_subst
স্টাডিজেক

এবং এই বৈশিষ্ট্যটির প্রস্তাবিত ব্যবহার কী? এটিকে সমর্থন করুন যখনই আপনার প্রোগ্রামটি এলোমেলো অ্যাক্সেস সহ কোনও ফাইলের প্রয়োজনের পরিবর্তে যুক্তিসঙ্গতভাবে একটি স্ট্রিমের সাথে কাজ করতে পারে?
মাস্টারেক্সিলো

7

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


7

প্রতিটি প্রক্রিয়া জন্য একটি stdinএবং এক আছে । এগুলি সাধারণত টার্মিনালের সাথে সংযুক্ত থাকে তবে এগুলি একে অপরের থেকে পৃথকভাবে পুনঃনির্দেশ করা যায়।stdout

উদাহরণস্বরূপ, দুটি wgetপ্রক্রিয়া জড়িত রয়েছে যার প্রতিটি তার নিজস্ব stdinএবং পায় stdout। প্রতিটি wgetপ্রক্রিয়া লিখেছেন -, যা এটি stdout। তারপর bashএর প্রক্রিয়া প্রতিকল্পন <(...)সংযোগ stdoutএকটি অনন্য সিউডো-ফাইল, যা থেকে প্রক্রিয়াতে diffপড়তে পারেন। নোট করুন যে দুটি প্রক্রিয়া বিকল্প দুটি পৃথক সিউডো-ফাইল দেয়! সুতরাং, diffকিছু দেখতে:

diff /dev/fd/XX /dev/fd/YY

যেখানে stdoutএর wget -q -O - URL1সাথে সংযুক্ত করা হয় /dev/fd/XX, এবং stdoutএর wget -q -O - URL2থেকে /dev/fd/YY

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