কমান্ড লাইনে স্বয়ংক্রিয়ভাবে ইনপুট প্রবেশ করান


141

আমি একটি স্ক্রিপ্ট চালাচ্ছি যা এটি প্রতিটি ক্রিয়াকলাপে 'y' প্রবেশের অনুরোধ করে, আমি $ ./script < echo 'yyyyyyyyyyyyyy'আমার সমস্ত ইনপুট এক সময়ের মধ্যে পাস করার মতো সমাধান খুঁজছি ।


কখনও কখনও -fবিকল্প নির্দিষ্ট কমান্ডের সাথে ভাল কাজ করে।
আইম্মিলিন্ড

উত্তর:


257

এই মামলার জন্য বিশেষত একটি কমান্ড তৈরি করা হয়েছে: yes

$ yes | ./script

এই কি আছে আউটপুট সংযোগ হয় yesএর ইনপুট ./script। সুতরাং যখন ./scriptব্যবহারকারী ইনপুট জিজ্ঞাসা এটি পরিবর্তে এর আউটপুট পাবেন yes। এর আউটপুট একটি নতুন লাইন অনুসরণ করে একটি yesঅন্তহীন স্ট্রিম y। সুতরাং মূলত যদি ব্যবহারকারী yপ্রতিটি প্রশ্নের জন্য প্রবেশ করা হয় ./script

যদি আপনি nহ্যাঁ ( y) এর পরিবর্তে না ( ) বলতে চান তবে আপনি এটি এটি করতে পারেন:

$ yes n | ./script

নোট করুন যে কয়েকটি সরঞ্জামের yesউত্তর হিসাবে সর্বদা আগমনের বিকল্প রয়েছে । উদাহরণস্বরূপ এখানে দেখুন: 'অ্যাপ-গেট আপগ্রেড'-এ হ্যাঁ / কোনও প্রম্পটকে বাইপাস করুন


ইনপুট প্রবেশের অন্যান্য পদ্ধতি:

yআপনার স্ক্রিপ্টটি ঠিক কতটা আশা করে আপনি যদি এটি করতে পারেন তবে আপনি এটি করতে পারেন:

$ printf 'y\ny\ny\n' | ./script

নতুনলাইনগুলি ( \n) হ'ল প্রবেশ কীগুলি।

printfপরিবর্তে yesআপনার ব্যবহার করে ইনপুটটির আরও সূক্ষ্ম দানাদার নিয়ন্ত্রণ রয়েছে:

$ printf 'yes\nno\nmaybe\n' | ./script

মনে রাখবেন যে কিছু বিরল ক্ষেত্রে কমান্ডের ব্যবহারকারীর চরিত্রের পরে এন্টার টিপতে হবে না। সেক্ষেত্রে নিউলাইনগুলি ছেড়ে দিন:

$ printf 'yyy' | ./script

সম্পূর্ণতার জন্য আপনি এখানে একটি নথিও ব্যবহার করতে পারেন :

$ ./script << EOF
y
y
y
EOF

বা যদি আপনার শেল এটি একটি স্ট্রিং সমর্থন করে :

$ ./script <<< "y
y
y
"

অথবা আপনি প্রতি লাইনে একটি ইনপুট দিয়ে একটি ফাইল তৈরি করতে পারেন:

$ ./script < inputfile

যদি কমান্ডটি যথেষ্ট জটিল এবং উপরের পদ্ধতিগুলি আর যথেষ্ট না হয় তবে আপনি প্রত্যাশা ব্যবহার করতে পারেন

এখানে একটি সুপার সাধারণ প্রত্যাশিত স্ক্রিপ্টের একটি উদাহরণ রয়েছে:

spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof

প্রযুক্তিগত নিটপিক:

আপনার প্রশ্নে আপনি যে হাইপোটিকাল কমান্ডের আবেদন করেছেন তা কার্যকর হয় না:

$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory

এটি কারণ শেল ব্যাকরণ কমান্ড লাইনের যে কোনও জায়গায় পুনর্নির্দেশ অপারেটরের অনুমতি দেয়। শেলটি যতটা উদাসীন, আপনার অনুমান কমান্ড লাইনটি এই লাইনের সমান:

$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory

এর অর্থ ./scriptযুক্তি দিয়ে ডাকা হবে 'yyyyyyyyyyyyyy'এবং স্টিডিন নামের একটি ফাইল থেকে ইনপুট পাবে echo। ফাইলটি বিদ্যমান না থাকায় বাশ অভিযোগ করে।


1
আমি একটি পেতে cannot enable tty mode on non tty input। আপনি কি এটির জন্য একটি কার্যনির্বাহী জানতে পারবেন?
বিএমপাসিনি

আমি যখন printfইনস্টলিং runপ্রক্রিয়াটি স্বয়ংক্রিয় করার জন্য একটি ফাইলের সাথে কৌতুকটি চেষ্টা করি তখন যা ঘটেছিল তা হ'ল আমি একটি ত্রুটি বার্তা বলছি Warning: Tried to connect to session manager, None of the authentication protocols specified are supportedএবং স্ক্রিপ্টটি একটি নতুন টার্মিনালে খোলে এবং আমাকে যথারীতি ম্যানুয়ালি আমার ইনপুট প্রবেশ করতে বলে। এটি ডেবিয়ান পথে ঘটছে। কোনও পরামর্শ?
ডেভিডবি

আরও বিশদ প্রয়োজন। মন্তব্যের জন্য খুব বড়। সমস্ত বিবরণ সহ একটি নতুন প্রশ্ন জিজ্ঞাসা করুন। আপনি এখানে একটি লিঙ্ক রাখতে পারেন।
লেসমানা

কিছুই CentOS হয়ে 'ভবঘুরে ধ্বংস' সঙ্গে কাজ করে
ড্রিউ

দুষ্ট সহজ! গুগল ক্লাউড বিটা এসকিউএল ডেটা আমদানিতে কাজ করে! অনেক প্রশংসিত!
জিএসটাইলে

11

কমান্ডটি ব্যবহার করুন yes:

yes | script

ম্যান পৃষ্ঠা থেকে অংশ:

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or 'y'.

9

কিছু জিনিস ( apt-getউদাহরণস্বরূপ) সাইলেন্ট মোডে চলার জন্য বিশেষ পতাকা গ্রহণ করে (এবং ডিফল্ট গ্রহণ করে)। ইন apt-getএর ক্ষেত্রে, আপনি শুধু এটা একটি পাস -yপতাকা। এটি যদিও আপনার স্ক্রিপ্টের উপর পুরোপুরি নির্ভর করে।

আপনার যদি আরও জটিল জিনিসের প্রয়োজন হয় তবে আপনি আপনার স্ক্রিপ্টটি একটি প্রত্যাশিত স্ক্রিপ্টে মোড়াতে পারেন। প্রত্যাশা আপনাকে আউটপুট পড়তে এবং ইনপুট প্রেরণের অনুমতি দেয় যাতে আপনি বেশ জটিল জিনিসগুলি করতে পারেন যা অন্যান্য স্ক্রিপ্টিং মঞ্জুরি দেয় না। এখানে এর উইকিপিডিয়া পৃষ্ঠা থেকে পাওয়া উদাহরণগুলির মধ্যে একটি :

# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof

এটি .shশেল স্ক্রিপ্ট দিয়ে এটি ব্যবহার করা যাবে না , তাই না? নাকি কোন উপায় আছে?
শায়ান

7

শেল স্ক্রিপ্টে আপনি স্প্যানের নিম্নলিখিত কৌশলগুলিও ব্যবহার করতে পারেন, আশা এবং প্রেরণ করতে পারেন

spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

তবে উপরের সিনেরিয়োতে ​​আপনাকে যে শব্দটিটি প্রত্যাশা করছেন তা দিতে হবে যখন আপনি স্ক্রিপ্টটি সম্পাদন করার সময় আরও উদাহরণ নীচের লিঙ্কে যান

বাশের মধ্যে প্রত্যাশা


2

ঠিক আছে, এটি খুব মার্জিত সমাধান নাও হতে পারে তবে আপনি যদি নিজের অপশনগুলি একটি পৃথক ফাইলে লিখেন এবং তারপরে স্ক্রিপ্টে একটি ইনপুট হিসাবে পাস করেন তবে এটিও কার্যকর হবে। সুতরাং আপনি যদি আপনার সমস্ত অপশন সহ একটি নতুন ফাইল তৈরি করেন (এই ফাইলটিকে 'বিকল্পগুলি' নামে ডাকা), তবে আপনি সহজেই আপনার স্ক্রিপ্টটি চালাতে ./script.sh < options.inএবং উপযুক্ত হিসাবে বিভিন্ন বিকল্প ফাইল সম্পাদনা / তৈরি করতে পারবেন।


options.inফাইলটি কীভাবে লিখব ? আপনি কি একটি উদাহরণ দিতে পারেন?
শায়ান

0

আমি ডায়ালগ সহ একটি বাশ স্ক্রিপ্ট লিখছিলাম এবং এটি স্বয়ংক্রিয়ভাবে ঘটানোরও দরকার ছিল। আমি এটি করেছি এবং এটি একটি কবজির মতো কাজ করেছে।

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog

-1

আপনি আপনার স্ক্রিপ্টে এই catস্ক্রিপ্টটিতে পাইপযুক্ত একটি পাঠ্য ফাইল থেকে আপনার স্ক্রিপ্টে ব্যবহারকারীর ইনপুট সরবরাহ করতে পারেন bash:

cat input.txt | bash your_script.sh

আপনার পছন্দসই ব্যবহারকারীর ইনপুটটি আপনার ইনপুট.টিএসটিএল ফাইলে রাখুন, যাই হোক না কেন উত্তর চান - y, n, সংখ্যা, স্ট্রিং ইত্যাদি



@ মুরু আমার জন্য, আপনি যে সমাধানটি উল্লেখ করেছেন সেগুলি কার্যকর হয়নি, তাই আমাকে নিজের আবিষ্কার করতে হবে।
ওয়েবকোমার

অসম্ভাব্য। আপনি উভয় একই জিনিস বর্ণনা।
মুড়ু

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

@ মুরু আমি বিশ্বাস করি যে দুজনের মধ্যে একটি পার্থক্য রয়েছে, যার কয়েকটি উত্তর থেকে বর্ণিত হয়েছে এখানে জিজ্ঞাসা করুন / জিজ্ঞাসা / জিজ্ঞাসা / 172982/… । আমার জন্য উদাহরণস্বরূপ, আমার কোড যদি আউটপুট ফাইলটিতে পুনঃনির্দেশিত হয় তবে বাম থেকে ডানে প্রাকৃতিক প্রবাহ হিসাবে আরও স্পষ্ট মনে হয়। সর্বোপরি, ডাউনভোটিং ভাল সমাধানের মতো কাজ করা যেমন আপনি এখানে লোকেরা তাদের সমাধান ভাগ করে নিতে উত্সাহিত করেন না। আমি বিশ্বাস করি যে ডাউনওটিংয়ের অপসারণের জন্য যথেষ্ট বলেছে।
ওয়েবকোমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.