একটি ইন্টারেক্টিভ প্রোগ্রামে অ-ইন্টারেক্টিভভাবে যুক্তিগুলি পাস করা


114

আমার কাছে বাশ স্ক্রিপ্ট রয়েছে যা readআদেশের সাথে ইন্টারঅ্যাক্টলি যুক্তিগুলি পড়তে কমান্ডটি নিয়োগ করে , উদাহরণস্বরূপ হ্যাঁ / কোনও বিকল্প নেই। এই স্ক্রিপ্টটিকে একটি অ-ইন্টারেক্টিভ স্ক্রিপ্টটিতে আর্গুমেন্ট হিসাবে ডিফল্ট বিকল্প মানগুলি পাস করার কোনও উপায় আছে?

এটি কেবল একটি বিকল্প নয় যা আমাকে ইন্টারেক্টিভ স্ক্রিপ্টে যেতে হবে।


2
এটি স্টিডিনের কাছ থেকে পড়তে থাকলে আপনি আপনার ইনপুটটি পাইপ করতে পারেন
এলসি।

4
এই প্রশ্নটি অনেক অনুলিপি পেয়েছে, এটি ইঙ্গিত করার মতো যে ইন্টারেক্টিভ প্রোগ্রামটি কোন ভাষায় লিখিত তা বিবেচ্য নয়। এটি কোনও সি প্রোগ্রাম হতে পারে যা স্ট্যান্ডার্ড ইনপুট, বা এরলং অ্যাপ্লিকেশন বা যা কিছু পড়তে পারে। কমান্ড লাইন থেকে চালিত এমন কিছু আছে এবং অযৌক্তিকভাবে ইন্টারেক্টিভ ইনপুট দাবি করে এবং আপনি এটি স্বয়ংক্রিয় করতে চান।
ট্রিপলি

অবশ্যই, যদি আপনার অযৌক্তিক অ্যাপ্লিকেশনটির নিয়ন্ত্রণ থাকে তবে এটিকে পুনরায় লিখুন যাতে এটি উত্তরগুলি নিরবচ্ছিন্নভাবে পড়তে পারে (একটি কনফিগারেশন ফাইলের মাধ্যমে, কমান্ড-লাইন বিকল্পগুলি বা যা কিছু)। এটি ইন্টারেক্টিভ প্রশ্নের ক্রম বা শব্দের পরিবর্তনের বিরুদ্ধে অনেক বেশি নির্ভরযোগ্য এবং দৃ is়।
ট্রিপলি

উত্তর:


46

আরও জটিল কাজের জন্য রয়েছে expect( http://en.wikedia.org/wiki/Expect )। এটি মূলত কোনও ব্যবহারকারীর অনুকরণ করে, নির্দিষ্ট প্রোগ্রাম আউটপুট এবং সম্পর্কিত স্টাফগুলিতে কীভাবে প্রতিক্রিয়া জানানো যায় আপনি একটি স্ক্রিপ্ট কোড করতে পারেন।

এটি এর মতো sshপাসওয়ার্ডগুলিকে পাইপ করা নিষিদ্ধ করার মতো ক্ষেত্রেও কাজ করে।


8
... যদিও এসএসএইচ ক্ষেত্রে সঠিক সমাধানটি পাবলিক-কী প্রমাণীকরণে স্যুইচ করা।
ট্রিপলি

154

অনেক পথে

আপনার ইনপুট পাইপ

echo "yes
no
maybe" | your_program

একটি ফাইল থেকে পুনর্নির্দেশ

your_program < answers.txt

এখানে একটি নথি ব্যবহার করুন (এটি খুব পঠনযোগ্য হতে পারে)

your_program << ANSWERS
yes
no
maybe
ANSWERS

এখানে একটি স্ট্রিং ব্যবহার করুন

your_program <<< $'yes\nno\nmaybe\n'

5
এটি উল্লেখ করে যে বহন করে যে প্রোগ্রামটি স্ট্যান্ডার্ড ইনপুটটি পড়লে এটি কেবল কাজ করে। কিছু প্রোগ্রামগুলি যেমন পাসওয়ার্ডগুলি ইন্টারেক্টিভভাবে পড়তে যায় না এমনকি এমনকি স্ট্যান্ডার্ড ইনপুটটি পাইপ হলেও। পাসওয়ার্ডগুলির জন্য, এটি সুরক্ষা কারণে বিবেচনা করে; যদিও কিছু ইন্টারেক্টিভ প্রোগ্রামগুলি কেবল সহজভাবে দুষ্কৃত করা হয়।
ট্রিপলি

@ ট্রিপলি আপনি যা বলেছেন তার লাইনের পাশাপাশি, স্ক্রিপ্ট কীভাবে স্ট্রিন দ্বারা প্রভাবিত না হওয়া পাসওয়ার্ডগুলি পড়বে? আমি জানি আপনি readস্টিডিন দখল করতে ব্যবহার করতে পারেন, আপনি যা বর্ণনা করেছেন তা কি করতে পারেন?
ফ্লো 2 কে

সেক্ষেত্রে আপনাকে দেখতে হবে যে প্রোগ্রামটির সাথে আপনি ইন্টারঅ্যাক্ট করার চেষ্টা করছেন তার ইনপুটটি প্রেরণের কোনও বিশেষ উপায় আছে (যেমন, এসএসপাস, এসএসএজ-এজেন্ট), বা ইন্টারেক্টিভের স্ক্রিপ্ট প্রত্যাশা ব্যবহার করুন।
গ্লেন জ্যাকম্যান

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

গুরুত্বপূর্ণ নোটিশ। সরবরাহিত কমান্ডগুলিতে স্পেস যুক্ত করলে এটি কার্যকর হয় না।
71GA

13

আপনি কোনও ফাইলের মধ্যে ডেটা রাখতে পারেন এবং এটিকে পুনরায় নির্দেশ করতে পারেন:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

স্ক্রিপ্টের জন্য ডেটা:

$ cat data.txt
2
3

স্ক্রিপ্ট কার্যকর করা হচ্ছে:

$ file.sh < data.txt
2
3

7

আরও একটি উপায় যুক্ত করতে চাই। এটি অন্য কোথাও খুঁজে পেয়েছে এবং এটি বেশ সহজ। বলুন আমি কমান্ড "এক্সিকিউট_কম্যান্ড" কমান্ড লাইনে সমস্ত প্রম্পটের জন্য হ্যাঁ পাস করতে চাই, তবে আমি কেবল এটিতে হ্যাঁ পাইপ করব।

yes | execute_command

এটি হ্যাঁ / না অনুরোধের সমস্ত উত্তর হিসাবে হ্যাঁ ব্যবহার করবে।


1

আপনি আপনার স্ক্রিপ্টে ইনপুটটি পাইপ করতে প্রিন্টফ ব্যবহার করতে পারেন।

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh

0

অ্যানোথ র‌্যালিটরিয়াল হতে পারে

echo "something" | tee /path/to/file

টি কমান্ডটি স্ক্রিনে প্রাপ্ত ইনপুটটি মুদ্রণ করে এবং একই সাথে এটি একটি ফাইলে সংরক্ষণ করে।

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