একটি প্রোগ্রামের স্ট্যান্ডার্ড ইনপুটটি অন্য কোনও আর্গ হিসাবে কীভাবে পাস করা যায়?


17

আসুন বলি যে একটি প্রোগ্রাম বিদ্যমান, যা দুটি যুক্তি গ্রহণ করে; ইনপুট ফাইল এবং আউটপুট ফাইল।

আমি যদি এই আউটপুট ফাইলটি ডিস্কে সংরক্ষণ করতে না চাই, তবে এটি সরাসরি stdinঅন্য কোনও প্রোগ্রামে দিয়ে দিন। এই অর্জন করার জন্য একটি উপায় আছে কি?

আমি লিনাক্সে প্রচুর কমান্ড পেয়েছি আউটপুট ফাইল আর্গুমেন্ট হিসাবে '-' পাস করার একটি বিকল্প সরবরাহ করে, যা আমি উপরে উল্লিখিত হিসাবে কাজ করে। এটি কি কারণ stdinকোনও প্রোগ্রামকে তর্ক হিসাবে পাস করা সম্ভব নয়? যদি তা হয় তবে আমরা কীভাবে এটি করব?

আমি কীভাবে এটি ব্যবহার করে চিত্র করব তার একটি উদাহরণ:

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" stdin(echo)

আমি যে শেলটি ব্যবহার করছি তা বাশ ash


1
cat <file | cmd /dev/fd/0বেশিরভাগ unices কাজ করে।
মাইক্রজারভ

আমার জন্য কাজ করছে না। সঙ্গে এটি চেষ্টা: cat < README.txt | cp /dev/fd/0। এটি বলেছিলcp: missing destination file operand after ‘/dev/fd/0’ Try 'cp --help' for more information.
ডিজিউগাস

1
program input-file /dev/stdout | another-program? এছাড়াও নোট করুন যে echoস্টিডিন থেকে কিছুই পড়েনা।
ইয়েগশি

1
@ ডিজিগাস - অবশ্যই না - আপনি cpকোথাও একটি ফাইল করতে পারবেন না । echo 1 2 3| cp /dev/fd/0 /dev/ttyমুদ্রণ করবে 1 2 3। এবং /dev/fd/[num]যাইহোক /dev/std(in|out|err), বেশিরভাগ ক্ষেত্রে তুলনায় কাজ করার সম্ভাবনা বেশি । আপনি কোথায় কাজ করতে পারবেন সে সম্পর্কে ফাইল-বর্ণনাকারীর লিঙ্কগুলি দেখুন ।
মাইক্রজারভ

1
একটি ভাল ইউনিক্স প্রোগ্রাম স্ট্যান্ডার্ড আউটপুটে লিখবে এটি ব্যবহারকারীকে সিদ্ধান্ত নিতে তারা কোনও ফাইল বা পাইপকে অন্য কমান্ডে পুনঃনির্দেশ করতে চায় কিনা to
জর্জে বুকারান

উত্তর:


13

প্রোগ্রামটি যদি কোনও ফাইল বর্ণনাকারীকে লেখার জন্য সমর্থন না করে এমনকি সমর্থন করে তবে আপনি /dev/stdoutআউটপুট ফাইল হিসাবে ব্যবহার করতে পারেন । এটি /proc/self/fd/1আমার সিস্টেমে একটি সিমিলিংক । ফাইল বর্ণনাকারী 1 হ'ল স্টডআউট।


এটি আমার প্রশ্নের সমাধান করেছে। সুতরাং যখন প্রোগ্রামটি সন্ধান করা দরকার তখন এটি করার কোনও উপায় নেই?
ডিজিউগাস

3
আপনি যদি ডিস্ক অ্যাক্সেস রোধ করার চেষ্টা করছেন, আপনি ফাইলটি / dev / shm / এ লিখতে পারেন, তবে আপনি যদি ফাইল সিস্টেমে কোনও ফাইল না চান তবে আমি যতদূর জানি, সন্ধানের উপায় নেই একটি নল. সামনে সন্ধান করার অর্থ এটি যে বিন্দুতে পৌঁছানো অবধি মেমোরিতে সমস্ত কিছু বাফার করতে হবে এবং পশ্চাৎপদ অনুসন্ধানগুলি বোঝায় যে স্মৃতিতে সমস্ত কিছু বাফার হয়েছে।
টিসিপিইউ

pdftotextঅনেকগুলি (তবে সমস্ত নয়) এর জন্য অন্যান্য ইউটিলিটিগুলি সমর্থন করে -(এটি এমন সিস্টেমগুলিতেও কাজ করবে যেগুলি / dev / stdout সমর্থন করে না, বা যেখানে / dev / stdout যেমন লিনাক্সের মতো প্রত্যাশিতভাবে কাজ করে না যেখানে স্টাডআউট নেই একটি নল). pdftotext file.pdf - | wc -c
স্টাফেন চেজেলাস

11

থেকে pdftotextমানুষ পৃষ্ঠা:

যদি পাঠ্য-ফাইলটি ´- 'হয় তবে পাঠ্যটি স্টডআউটে প্রেরণ করা হয়।

সুতরাং এক্ষেত্রে আপনার যা প্রয়োজন তা হ'ল:

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" -

বা আপনি যদি অন্য কোনও প্রোগ্রামের STDIN এ এটি পাইপ করতে চান:

pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" - | another_prog

ব্যবহার -একটি ফাইল জন্য বিকল্প হিসেবে একটি কনভেনশন অনেক ইউটিলিটি (pdftotext সহ) যখন আমরা stdout- এ stdin থেকে ইনপুট অথবা আউটপুট চান অনুসরণ করে। তবে সমস্ত ইউটিলিটি এই সম্মেলনটি অনুসরণ করে না। সেক্ষেত্রে ব্যাশে এটি করার অহঙ্কারী পদ্ধতিটি একটি প্রক্রিয়া প্রতিস্থাপন ব্যবহার করা হয় :

my_utility "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" >( cat )

এখানে >( )মূলত কোনও ফাইলের পাসের মতো আচরণ করে my_utilityতবে প্রকৃত ফাইল হওয়ার পরিবর্তে প্রবাহটি অন্তর্ভুক্ত প্রক্রিয়াটির স্টিডিনে বিভক্ত হয়, যেমন বিড়াল। সুতরাং এখানে, টেক্সট শেষ পর্যন্ত প্রয়োজন হিসাবে আউটপুট করা উচিত।

catপ্রায় সর্বদা ব্যবহার এই জাতীয় ফোরামে UUOC এলার্ম ঘণ্টা বন্ধ করে দেয় । আমি যুক্তি দিচ্ছি যে যদি ইউটিলিটি সমর্থন না করে -, তবে এটি একটি দরকারী ব্যবহার cat, যদিও যদি এই প্রক্রিয়াটি প্রতিস্থাপন ছাড়া কোনও উপায় থাকে catতবে আমি সমস্ত কান ;-)।

তবে, (যদি প্রশ্নটি হিসাবে বলা হয়) স্ট্রিমের চূড়ান্ত গন্তব্য হ'ল অন্য প্রোগ্রামের এসটিডিএন, তবে catএটিকে নির্মূল করা যেতে পারে:

my_utility "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" >( another_prog )

2
এবং আমাকে আরও ব্যাকপ্যাড করা যাক: যদি স্টডআউটকে prog2লিখেন তবে এর চেয়ে ভাল , কারণ ফর্মটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে (যেমন শেলটি পরবর্তী প্রম্পট দেওয়ার আগে বা পরবর্তী কমান্ডে যাওয়ার আগে (যেমন, পরে বা )), যখন -বিহীন ফর্মটি কেবলমাত্র সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে । এছাড়াও, ফর্মের পরে , এটি থেকে প্রস্থান স্থিতি , অন্যদিকে, থেকে প্রস্থান স্থিতি । (আপনি আপনার অর্থ প্রদান করেন এবং আপনি নিজের পছন্দটি গ্রহণ করেন))prog1 input_file >( cat ) | prog2prog1 input_file >( prog2 )catprog2;&&catprog1cat$?prog2$?prog1
স্কট

4

যদি আপনার শেল তাদের সমর্থন করে তবে এ জাতীয় কৌশলগুলি করার সহজ উপায় হ'ল প্রক্রিয়া বিকল্প ব্যবহার করা : <(…)এবং >(…)। এটি ব্যাশ, zsh এবং ksh এবং সম্ভবত অন্যান্য শেলগুলিতে কাজ করে। উদাহরণ স্বরূপ:

$ sort <(printf "b\nc\na\n")
a
b
c
$ ls
foo
$ cp <(find . -name foo) bar
$ ls
bar  foo

যাইহোক, আপনি যে উদাহরণটি উল্লেখ করেছেন তাতে pdftotextএটি কোনও টেক্সট ফাইলে সংরক্ষণ করবে না file আপনার সেরা পছন্দটি (ব্যবহারের সুস্পষ্ট পছন্দ বাদে -) /dev/stdout@ টিসিপিইউ-র পরামর্শ অনুযায়ী ব্যবহার করা হয়, আপনি অন্য শেল বৈশিষ্ট্যটিও ব্যবহার করতে পারেন। কনস্ট্রাক্টটি !:Nপূর্ববর্তী কমান্ডের Nth তর্ককে বোঝায়। অতএব, আপনি করতে পারেন:

$ pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf"  out.txt
$ cat !:2

1
যদিও আমি একমত যে cat <()এটি কিছু পরিস্থিতিতে কার্যকর হতে পারে, এই দৃশ্যে তবে এটি মোটেই কার্যকর হচ্ছে না। সমস্যা (ওপি দ্বারা খুব খারাপভাবে বর্ণিত, আমি স্বীকার করতেই হবে) যে pdftotextদুটি যুক্তি লাগে: ইনপুট ফাইল এবং আউটপুট ফাইল । যদি দ্বিতীয় তর্কটি অনুপস্থিত থাকে তবে এটি কিছুই তৈরি করে না, তাই cat <(pdftotext "file.pdf")কিছুই ফিরিয়ে দেবে না। কেউ ডিজিটাল ট্রমা জবাব pdftotextদেওয়ার >(cat)মতো দ্বিতীয় যুক্তি হিসাবে আদেশ দিয়ে প্রতারণা করতে পারে , তবে cat <()এখানে অর্থহীন। অবশ্যই আউটপুট ফাইলের নাম হিসাবে pdftotextব্যবহার -করা ভাল ।
জিম্মিজ

1
@ স্কট আমার উত্তরটি একটি ইউইউসি কীভাবে? আপনি বিড়াল ছাড়াই এই প্রক্রিয়াটির বিকল্প কীভাবে করবেন? >( )যে প্রক্রিয়াটির অভ্যন্তরে রয়েছে সেটিকে কার্যকরভাবে স্ট্রিমটি পাইপ করবে - সুতরাং catসেই স্ট্রিমটিকে আউটপুট দেওয়ার জন্য আমাদের আসলে এখানে একটি প্রয়োজন । সাধারণত আমাদের মতো কিছু করতে সক্ষম হওয়া উচিত pdftotext input.pdf -, তবে দৃশ্যত pdftotextকোনও -ফাইলের পরিবর্তে স্টাডআউটে সরাসরি আউটপুট করার পরামিতি সমর্থন করে না - এটি চেষ্টা করুন।
ডিজিটাল ট্রমা

1
@ ডিজিটাল ট্রামুমা এটি ইউওক নয়। আমি বিশ্বাস করি যে বিড়াল কেবলমাত্র মুদ্রণের ক্ষেত্রে আপনি সবচেয়ে দ্রুত পেতে পারেন তবে বাস্তবে আপনি আরও কমান্ডকে >(grep something)আরও কার্যকর হিসাবে ব্যবহার করতে পারেন । BTW, আমার pdftotext 3.04 করণীয় সমর্থন -একটি আউটপুট ফাইল হিসাবে, তাই আমি আছি একটু পুরো আলোচনা বিস্মিত।
জিম্মিজ

1
@ স্টারডন আমি স্টিকারর হিসাবে ঘৃণা করি, তবে এটি কার্যকর হবে বলে মনে হয় না। বিশেষত এটি চলমান যে আলাদা নয় pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf", যা ডাকা একটি ফাইলের আউটপুট রাখে C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.txt, তবে কোনও পাঠ্য অন্য কোনও প্রোগ্রামে পাইপিংয়ের জন্য STDOUT এ আউটপুট হয় না।
ডিজিটাল ট্রমা

1
@ ডিজিটাল ট্রামুমা যে স্টিকার লাগছে না! এটাই আমার বোকা। এটি নির্দেশ করার জন্য ধন্যবাদ এবং ভুলগুলি নির্দেশ করার সময় দয়া করে কখনই ক্ষমা করবেন না। আমি বরং আমার ভুলটি আমার দিকে ইঙ্গিত করব এবং তাই এটি সমস্ত সন্দেহজনক গৌরবতে রেখে যাওয়ার চেয়ে কিছু শিখতে চাই।
টেরডন

-2
cmd tty

ttyসংযুক্ত টার্মিনালের নামটি দেয় stdout


আমি নিশ্চিত নই যে এটি কীভাবে প্রশ্নের উত্তর দেয়, যা আদেশের সংমিশ্রণের বিষয়ে; আপনি কীভাবে এটি অর্জন করবেন তার একটি উদাহরণ দিয়ে সম্ভবত আপনি প্রসারিত করুন।
ধাগ

আমার ধারণা আপনি ttyটার্মিনালের নামটি যাচাই করতে বলছেন , এবং তারপরে সেই ফাইলটি আউটপুট হিসাবে ব্যবহার করুন, উদাহরণস্বরূপ pdftotext file.pdf /dev/pts/2। সেক্ষেত্রে আমি একমত।
জিম্মিজ

এটি সংক্ষিপ্ত / স্বয়ংক্রিয়ভাবে সংযুক্ত করা যেতে পারে ; যা সাধারণত সমান হতে চলেছে । কিন্তু এই পদ্ধতির অনুমান লক্ষ্য আউটপুট প্রদর্শন করে যে (অর্থাত, টার্মিনালে), এবং নয় কি প্রশ্ন জিজ্ঞাসা করা হয় (দেখুন মন্তব্য উপর terdon এর উত্তর প্রশ্নটা করার মানে কিছু শোধন জন্য)। prog1  input_file $(tty)prog1  input_file /dev/ttyprog1
স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.