অস্থায়ী ডেটার জন্য সিউডো ফাইল


98

আমি প্রায়শই অপেক্ষাকৃত সংক্ষিপ্ত স্ট্রিং ডেটা (যদিও বেশ কয়েকটি লাইন হতে পারে) কমান্ডলাইন প্রোগ্রামগুলিতে ফিড করতে চাই যা কেবল ফাইলগুলি (যেমন ডাব্লুডিডিফ) থেকে বারবার ফ্যাশনে কেবল ইনপুট গ্রহণ করে। অবশ্যই আমি এক বা একাধিক অস্থায়ী ফাইল তৈরি করতে পারি, সেখানে স্ট্রিংটি সংরক্ষণ করতে পারি এবং পরামিতি হিসাবে ফাইলের নাম দিয়ে কমান্ডটি চালাতে পারি। তবে আমার কাছে এটি দেখে মনে হচ্ছে যেন এই পদ্ধতিটি অত্যন্ত অদক্ষ হয়ে থাকে যদি ডেটা আসলে ডিস্কে লিখিত হয় এবং এটি যদি ডিস্কের প্রয়োজনের চেয়ে বেশি ক্ষতি করতে পারে তবে আমি যদি এই পদ্ধতিটি বহুবার পুনরাবৃত্তি করি, উদাহরণস্বরূপ যদি আমি দীর্ঘ পাঠ্যের একক লাইন ফিড করতে চাই ফাইলগুলি wdiff করতে। এটি থেকে বিরত থাকার জন্য কি কোনও প্রস্তাবিত উপায় রয়েছে, সিউডো ফাইল যেমন পাইপগুলির সাহায্যে ডেস্কে প্রকৃতপক্ষে এটি লিখে না রেখে অস্থায়ীভাবে ডেটা সংরক্ষণ করার জন্য বলুন (বা এটি একটি সমালোচনামূলক দৈর্ঘ্য ছাড়িয়ে গেলে কেবল এটি লিখবেন) say দ্রষ্টব্য যে wdiff দুটি যুক্তি গ্রহণ করে এবং,wdiff <"text"


এর মাধ্যমে xargsকি সমাধান করা যায় ?
এনএন

জানি না, তবে কীভাবে তা আমার কাছে স্পষ্ট হবে না। আমি যতদূর বুঝতে পারি xargsকমান্ডের জন্য ফাইল স্ট্রিং আর্গুমেন্ট থেকে ইনপুট লাইন তৈরি করবে। তবে আমার বিপরীত দরকার।
highsciguy

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

এর সাথে কী হয়েছে echo $data_are_here | dumb_program?
ভনব্র্যান্ড

1
এটি কেবলমাত্র একটি ইনপুট ফাইল সমর্থন করবে এবং সমস্ত প্রোগ্রাম স্টিডিন থেকে পড়বে না।
highsciguy

উত্তর:


55

একটি নামক পাইপ ব্যবহার করুন । উদাহরণস্বরূপ:

mkfifo fifo
echo -e "hello world\nnext line\nline 3" > fifo

-eপ্রতিধ্বনি বলে সঠিকভাবে সম্পর্কে newline পালাবার ব্যাখ্যা করা ( \n)। এটি অবরুদ্ধ হবে, অর্থাত পাইপ থেকে ডেটা না পড়লে আপনার শেলটি ঝুলবে।

অন্য শেলটি কোথাও এবং একই ডিরেক্টরিতে খুলুন:

cat fifo

আপনি প্রতিধ্বনিটি পড়বেন, যা অন্য শেলটি প্রকাশ করবে। যদিও পাইপটি ডিস্কে একটি ফাইল নোড হিসাবে উপস্থিত রয়েছে, তবে যে ডেটা এটি দিয়ে যায় তা নয়; এটি সব স্মৃতিতে স্থান নেয়। আপনি &প্রতিধ্বনি ( ) করতে পারেন ।

পাইপে একটি 64k বাফার (লিনাক্সে) রয়েছে এবং সকেটের মতো লেখক পূর্ণ হয়ে গেলে তাকে ব্লক করে দেবে, আপনি যতক্ষণ না লেখককে অকালমুক্ত না করেন ততক্ষণ আপনি ডেটা হারাবেন না।


ঠিক আছে, ধন্যবাদ, এটি দুটি নামযুক্ত পাইপ এবং ডাব্লুডিফ সহও কাজ করে। তবে আমি বুঝতে পেরেছি যে পাইপের জন্য বাফার হিসাবে একটি নির্দিষ্ট (ছোট) মেমরি উপলব্ধ। আমি বাফারের চেয়ে বেশি হলে কী হবে?
highsciguy

আমি এই সমস্যাটি সম্পর্কে একটি চূড়ান্ত অনুচ্ছেদ যুক্ত করেছি।
স্বর্ণলোক

3
/tmptmpfsর‌্যামে থাকা একটি ফাইল সিস্টেম ব্যবহার করতে বেশিরভাগ ডিস্ট্রোজে কনফিগার করা হয় । আপনি এতে কোনও ফাইল লিখলে /tmpসরাসরি আপনার র‍্যামে চলে যায় যা আধা-রোধক ফাইলগুলির জন্য খুব ভাল উত্তর যা দ্রুত অ্যাক্সেস করতে হয় এবং বহুবার পুনরায় লিখতে হয়।

129

বাশ-এ, আপনি command1 <( command0 )পুনর্নির্দেশ সিনট্যাক্স ব্যবহার করতে পারেন , যা command0স্ট্যান্ডআউটের পুনঃনির্দেশ করে এবং এটি command1কোনও কমান্ড-লাইন আর্গুমেন্ট হিসাবে কোনও ফাইলের নাম গ্রহণ করে passes একে প্রক্রিয়া প্রতিস্থাপন বলা হয় ।

কিছু প্রোগ্রাম যা ফাইল নাম কমান্ড-লাইন আর্গুমেন্ট গ্রহণ করে তাদের আসলে একটি বাস্তব র্যান্ডম-অ্যাক্সেস ফাইলের প্রয়োজন হয়, সুতরাং এই কৌশলটি তাদের পক্ষে কাজ করবে না। তবে এটি এর সাথে সূক্ষ্মভাবে কাজ করে wdiff:

user@host:/path$ wdiff <( echo hello; echo hello1 ) <( echo hello; echo hello2 )
hello
[-hello1-]
{+hello2+}

ব্যাকগ্রাউন্ডে এটি একটি ফিফো তৈরি করে, ফিফোর ভিতরে কমান্ডটি পাইপ করে <( )এবং ফিফোর ফাইল বিবরণকারীকে একটি আর্গুমেন্ট হিসাবে পাস করে। কী চলছে তা দেখতে, এটির সাথে echoকিছু না করে যুক্তিটি মুদ্রণের সাথে এটি ব্যবহার করে চেষ্টা করুন :

user@host:/path$ echo <( echo hello )
/dev/fd/63

নামী পাইপ তৈরি করা আরও নমনীয় (যদি আপনি একাধিক প্রক্রিয়া ব্যবহার করে জটিল পুনঃনির্দেশ যুক্তিটি লিখতে চান) তবে অনেকগুলি উদ্দেশ্যে এটি যথেষ্ট, এবং এটি ব্যবহার করা স্পষ্টতই সহজ।

এর রয়েছে >( )যখন আপনি আউটপুট, যেমন হিসাবে এটি ব্যবহার করতে চান তাদের জন্য সিনট্যাক্স

$ someprogram --logfile >( gzip > out.log.gz )

সম্পর্কিত কৌশলগুলির জন্য বাশ পুনর্নির্দেশগুলি চিট শীটটি দেখুন ।


এটি কেএসএইচ সমর্থন করে না
1987

5
ksh এটি আবিষ্কার করেছিলেন। আপনি ksh এর একটি বৈকল্পিক ব্যবহার করছেন যা এটি সমর্থন করে না
নীল ম্যাকগুইগান

2
কিছু প্রোগ্রাম যা ফাইল নাম কমান্ড-লাইন আর্গুমেন্ট গ্রহণ করে তাদের আসলে একটি বাস্তব র্যান্ডম-অ্যাক্সেস ফাইলের প্রয়োজন হয়, সুতরাং এই কৌশলটি তাদের পক্ষে কাজ করবে না। আপনি এই ক্ষেত্রে কি করবেন। উদাহরণস্বরূপ ssh -F <(vagrant ssh-config) defaultসত্যিই দুর্দান্ত হবে কিন্তু হায়।
সুকিমা

10

ডাব্লুডিইফ একটি বিশেষ ক্ষেত্রে যার জন্য এটিতে 2 ফাইল নাম যুক্তি প্রয়োজন, তবে সমস্ত কমান্ডের জন্য কেবল 1 টি যুক্তি প্রয়োজন এবং যা দৃ which়ভাবে একটি ফাইল নাম যুক্তি ছাড়া আর কিছু নিতে অস্বীকার করে, সেখানে 2 টি বিকল্প রয়েছে:

  • ফাইলের নাম '-' (এটি একটি বিয়োগ চিহ্ন) প্রায় 1/2 সময় কাজ করে। এটি কমান্ডের প্রশ্নে এবং কমান্ডের বিকাশকারী কেসটিকে আটকে রেখেছে এবং এটি প্রত্যাশার মতো পরিচালনা করছে কিনা তা নির্ভর করে বলে মনে হচ্ছে। যেমন

    $> এলএস | বিড়াল -

  • লিনাক্সে / dev / stdin নামে একটি psuedo ফাইল রয়েছে যা কোনও কমান্ডের দ্বারা কোনও ফাইলের নাম প্রয়োজন হলে ব্যবহার করা যেতে পারে। এটি কাজ করার সম্ভাবনা বেশি কারণ এটি কমান্ড থেকে কোনও বিশেষ ফাইল নাম হ্যান্ডলিংয়ের প্রয়োজন হয় না। যদি একটি ফিফো কাজ করে, বা ব্যাশ প্রক্রিয়া প্রতিস্থাপন পদ্ধতি কাজ করে তবে এটিও কাজ করা উচিত এবং এটি শেল নির্দিষ্ট নয়। যেমন

    $> এলএস | বিড়াল / দেব / স্ট্ডিন


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