ফাইলের প্রত্যাশায় প্রোগ্রামে পাঠ্য পাঠান


30

স্ট্যাক ওভারফ্লোতে জিজ্ঞাসা করা একটি প্রশ্নের সাথে সম্পর্কিত: wsadmin.sh এ কোডের একাধিক লাইনগুলি পাস করা?

আমার কাছে একটি স্ট্রিং হিসাবে কয়েক লাইন ইনপুট রয়েছে যা আমাকে কমান্ডে ফিড করতে হবে। কমান্ডটি কেবল ইনপুট পূর্ণ একটি ফাইল গ্রহণ করে।

আমি কোনও অস্থায়ী ফাইল বা পাইপে লাইনগুলি সঞ্চয় করতে পারি যা আসলে কখনই ডিস্কে লিখিত হয় না এবং তারপরে সরাসরি প্রোগ্রামে ফিড করে?

পাইপটি অর্জন করা, এতে ইনপুট খাওয়ানো, সেই পাইপটি কমান্ডের মধ্যে দিয়ে যাওয়া, এবং তারপরে পাইপ থেকে মুক্তি পাওয়ার বিষয়ে আমি কীভাবে যেতে পারি?


2
আপনি যে কমান্ডটি ব্যবহার করছেন তার উদাহরণ যুক্ত করতে পারেন এবং কীভাবে এটি চাওয়ার কথা রয়েছে?
ব্রেকথ্রু

2
তার মানে কি প্রোগ্রামটি স্টিডিন গ্রহণ করে না?
লিও লাম

আমি উপরে উভয় মন্তব্যকারীদের সাথে একমত। প্রোগ্রামটির চশমাগুলি না জেনে কোনও কাজ করতে পারে এমন প্রস্তাব দেওয়া অসম্ভব।
লারসেন্ড 13'15

উত্তর:


27

আর একটি সমাধান বাশে প্রক্রিয়া সাবস্টিটিউশন ব্যবহার করা । যদি আপনার সিস্টেমে পাইপের নাম দেওয়া হয়েছে, আপনি এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

এটি এভাবে ব্যবহার করা হয়:

program_expecting_a_file <(list)

listশেল কমান্ডের ক্রম কোথায় (আসলে পাইপলাইন; সম্পূর্ণ বিবরণ এখানে )। listকার্যকর করা হবে এবং এর আউটপুটটি পাইপের সাথে সংযুক্ত হবে। তারপরে পাইপের নামটি আপনার প্রোগ্রামে প্রেরণ করা হবে।

দ্রষ্টব্য:< এবং এর মধ্যে ফাঁকির অনুমতি নেই (

(অন্যান্য প্রতিস্থাপনটিও >(list)আপনি যেমন আশা করেছিলেন তেমন কাজ করে))

আপনার নির্দিষ্ট ক্ষেত্রে, আপনি ব্যবহার করতে পারেন

program_expecting_a_file <(echo "$your_strings")

যদিও আপনি @ meuh এর সমাধানটি আরও মার্জিত হতে পারেন।

আপডেট: অ্যাডভান্সড ব্যাশ স্ক্রিপ্টিং গাইডে অনেকগুলি দুর্দান্ত ব্যবহারের উদাহরণ পাওয়া যাবে ।


অন্য দু'টি এমনকি মামলার সবচেয়ে তুচ্ছ কাজ করতে পারেনি। আপনার এখন পর্যন্ত আমি যে পরীক্ষাগুলি ফেলেছি তা পাস করে। আমি আপাতত আপনাকে উন্নত করেছি আমি ফিরে এসে এটিকে গ্রহণযোগ্য হিসাবে চিহ্নিত করব যদি এটি আমার প্রয়োজনীয় সমস্ত কিছু করে।
আর্টঅফ ওয়ারফেয়ার

আপনার পুরোপুরি কাজ করে। যদি আপনি চান, আপনি এটি স্ট্যাকওভারফ্লো সম্পর্কিত সম্পর্কিত প্রশ্নে যুক্ত করতে পারেন এবং আমি এটি সেখানেও গ্রহণ করতে পারি। stackoverflow.com/questions/31374202/...
ArtOfWarfare

হাই @ আর্টঅফ ওয়ারফেয়ার, সাহায্য পেয়ে আনন্দিত। একই প্রস্তাবিত সমাধানটি নিয়ে ইতিমধ্যে সেখানে একটি মন্তব্য রয়েছে, সুতরাং সেখানে উত্তর পোস্ট করা আমার পক্ষে ঠিক হবে না।
এডওয়ার্ড

তিনি সমাধান করার আগে আপনি আপনার সমাধান পোস্ট করেছেন। যাইহোক, আমি তাকে তার মন্তব্যে একটি উত্তর পরিবর্তন করতে বললাম যাতে আমি এটি গ্রহণ করতে পারি। আপনারা কেউ যদি এই প্রশ্নের ২৪ ঘন্টার মধ্যে উত্তর পোস্ট করেন না তবে আমি কেবল উত্তরটি নিজেরাই পোস্ট করতে পারি যাতে আমি তা গ্রহণ করতে পারি (উত্তরটি কী তা খুঁজে পেয়ে আমি আমার উত্তরগুলি উত্তরহীন বলে মনে করি তা পছন্দ করি না It's এটি ভবিষ্যতের পাঠকদের / প্রশ্নের উত্তরদাতাদের জন্য কেবল খারাপ আচরণ))
আর্টঅফ ওয়ারফেয়ার

হাই @ আর্টঅফ ওয়ারফেয়ার, আপনার প্রস্তাব অনুসারে আমি একদম ঠিক আছি!
এডওয়ার্ড

15

আপনি একটি ব্যাশ ব্যবহার করতে পারেন এখানে-ডক । উদাহরণ স্বরূপ,

$ cat -n <<<'a
> b'
 1  a
 2  b

আপনার যদি ব্যাশ ভেরিয়েবলের কিছু থাকে তবে আপনি এটির সাথে বিভাজনও করতে পারেন: যেমন <<<"path is $PATH"


যদি আপনার কমান্ড কোনও ফাইলের উপর জোর দেয় তবে আপনি এটি দিতে পারেন /dev/stdin। উদাহরণ:

$ sed -f /dev/stdin <<<'s/a/b/'

আউটপুট উত্পাদন করে: s/b/b/


কমান্ডটি ইনপুটটি গ্রহণ করে কিনা তা প্রশ্ন থেকে পরিষ্কার নয় stdinএবং যদি না হয় তবে এটি কার্যকর হবে না। আশা করি ওপি স্পষ্ট করে দেবে।
ডেভিড জেড

1
:( - এটি দুর্দান্ত প্রতিশ্রুতিবদ্ধ বলে মনে হয়েছিল, তবে যখন আমি এটি চেষ্টা করেছি তখন আমি ত্রুটির বার্তাটি পেয়েছি"-f" option must be followed by a file name.
আর্টঅফ ওয়ারফেয়ার

একটি এখানে-ডক স্টিডিন জন্য। যদি আপনার কমান্ডটি একেবারে -fএবং একটি ফাইলের প্রয়োজন হয়, তবে ফাইলের নাম সরবরাহ করুন /dev/stdin। আমার সম্পাদনা দেখুন।
meuh

আমি মনে করি সম্পাদনাগুলির পরে এটি একেবারে কার্যকর একটি বিকল্প!
এডওয়ার্ড

1
/dev/stdinপরামর্শের জন্য +1 । আমি যে প্রোগ্রামটি কল করার চেষ্টা করছি তা কেবল একটি ফাইলের নাম গ্রহণ করে, তাই আমি /dev/stdinএকটি হেরডোকের সাথে একত্রিত করেছি।
হু ওয়াল্টারস

7

কি লিপিতে উপর ভিত্তি করে, আপনি হতে পারে (বিয়োগ) যা ঘোরা - বিশেষ ফাইলের নাম ব্যবহার করতে পারবে stdin

$ mycmd -
Line 1
Line 2
^D

আরেকটি পদ্ধতি, যা তোমাদের জন্য কাজ করতে পারে ফাইল খোলার জন্য হয় /dev/fd/0যা আবার ঘোরা stdin

একটি তৃতীয় বিকল্প একটি ফিফো তৈরি করতে পারে (ফার্স্ট ইন ফার্স্ট আউট)। এটি কোনও ফাইলের মতো তবে এর দুটি প্রান্ত রয়েছে - আপনি একটি প্রান্তে লিখে অন্য প্রান্ত থেকে পড়েন।

-- Process 1 --                  -- Process 2 --
$ mkfifo foo
$ cat foo
<waits>                          $ echo hello > foo
hello                            $
$ rm foo

3
এটি লক্ষণীয় যে প্রোগ্রামটি -এইভাবে ব্যাখ্যা করতে লিখতে হবে - এটি শেল বা অপারেটিং সিস্টেমের কোনও বৈশিষ্ট্য নয়। যদিও অবশ্যই বেশিরভাগ স্ট্যান্ডার্ড লিনাক্স ইউটিলিটিগুলি এই কনভেনশনটি অনুসরণ করে, যতদূর আমি জানি।
ডেভিড জেড

1
নাঃ। এটি প্রোগ্রামটির জন্য কাজ করে না। একটি ইন্টারেক্টিভ মোড আছে, তবে আমি অন্য প্রোগ্রাম থেকে এই প্রোগ্রামটি কার্যকর করতে আদেশগুলি পাস করতে চাই এবং আমি খরগোশের গর্তে যেতে চাই না expect
আর্টঅফ ওয়ারফেয়ার

@ আর্টঅফ ওয়ারফেয়ার আমি কেবল একটি তৃতীয় বিকল্প যুক্ত করেছি যা কাজ করতে পারে।
মাজনকো

চমৎকার উত্তর! দ্বিতীয় এবং তৃতীয় বিকল্পগুলি মূলত <()সমাধানটির মতো তবে আরও স্পষ্ট - যা খুব কার্যকর হতে পারে!
এডওয়ার্ড

4

mycmd -সমাধানের মতো আরও একটি বিকল্প রয়েছে , তবে এমন প্রোগ্রামগুলির জন্যও যা -বিশেষভাবে পরিচালনা করে না :

$ mycmd /dev/stdin
Line 1
Line 2
^D

/dev/stdin ওএস-সম্পর্কিত বলে মনে হচ্ছে এবং এটি আমার জন্য ডেবিয়ান জিএনইউ / লিনাক্সে কাজ করে তবে আমি নিশ্চিত নই যে এটি অন্য কোথাও কাজ করবে।


1
দেখে মনে হচ্ছে এটি কাজ করতে পারে তবে কী ^D?
আর্টঅফ ওয়ারফেয়ার

^DCtrl-D টিপানোর জন্য একটি সাধারণ স্বরলিপি। । ডি এর "ইনপুট স্ট্রিমের শেষ" এর শব্দার্থক রয়েছে। এটি সম্ভবত আরও প্রায়ই দেখা যায় ^Cবা ^Zযা Ctrl-C টিপতে যথাক্রমে Ctrl-Z টিপতে থাকে।
এক্সেল বেকার্ট

1
এটি কাজ করছে বলে মনে হচ্ছে না, তবে আমি কীভাবে প্রোগ্রামগতভাবে জিনিসগুলি intoোকাতে /dev/stdinএবং তারপরে এটি বন্ধ করব?
আর্টঅফ ওয়ারফেয়ার

1
এই কমান্ডের মধ্যে কেবল কিছু পাইপ করুন এবং এটির কাজ করা উচিত, যেমন cat content | mycmd /dev/stdincatএখানে চেয়ে আলাদা কমান্ডের কল্পনা করুন imagine
এক্সেল বেকার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.