লিনাক্স ডস বিরতির সমতুল্য কি?


236

আমার একটি বাশ শেল স্ক্রিপ্ট রয়েছে যাতে আমি ব্যবহারকারী কোনও কী চাপ না দেওয়া পর্যন্ত মৃত্যুদন্ড কার্যকর করতে বিরতি দিতে চাই। ডস-এ, এটি "বিরতি" কমান্ডের সাহায্যে সহজেই সম্পন্ন হয়। আমি কি আমার স্ক্রিপ্টে লিনাক্স সমতুল্য ব্যবহার করতে পারি?

উত্তর:


329

read এই আছে:

user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$ 

-n1নির্দিষ্ট করে এটি শুধুমাত্র একটি একক অক্ষর জন্য অপেক্ষা পারে। -rরাখে এটা কাঁচা মোড, যা কারণ অন্যথায় প্রয়োজনীয়, যদি আপনি ব্যাকস্ল্যাশ ভালো কিছু চাপুন মধ্যে, এটা করো না, যে পর্যন্ত আপনি পরবর্তী কীতে চাপ দিন। -pনির্দিষ্ট করে প্রম্পট, যা যদি এটি স্পেস রয়েছে উদ্ধৃত করা আবশ্যক। keyযুক্তিটি কেবল তখনই প্রয়োজনীয় যদি আপনি জানতে চান যে তারা কী কী চাপেছে, কোন ক্ষেত্রে আপনি এটির মাধ্যমে অ্যাক্সেস করতে পারবেন $key

আপনি যদি ব্যাশ ব্যবহার করে থাকেন তবে আপনি এর সাথে একটি টাইমআউটও নির্দিষ্ট করতে পারবেন -t, যা কোনও কী টিপানো না হলে পঠন ব্যর্থতা ফিরে আসে। উদাহরণস্বরূপ:

read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
    echo 'A key was pressed.'
else
    echo 'No key was pressed.'
fi

5
কড়া কথা বললে, তা হবে "Enter any non-NUL character to continue"। কিছু কী কোনও অক্ষর (যেমন Ctrl...) প্রেরণ করে না এবং কিছুগুলি একের বেশি (যেমন F1, Home...) প্রেরণ করে । bashNUL অক্ষর উপেক্ষা করে।
স্টিফেন চেজেলাস

2
সাধারণত এন্টার, স্পেস বা ওয়াই এর মতো নির্দিষ্ট কী জিজ্ঞাসা করা আরও ভাল ধারণা "" যে কোনও "কিছু ব্যবহারকারীকে বিভ্রান্ত করতে পারে, একটি ট্যাব-কী আছে তাই কেন কোনও চাবি নেই এবং নিশ্চিতভাবেই এমন কীগুলি রয়েছে যা সম্ভবত বিপজ্জনক ইস্ক্যাপ, সিটিআরএল, সিএমডি, পাওয়ার বোতাম ইত্যাদির মতো এটি আজকের দিনে এতটা প্রাসঙ্গিক নয় কারণ আজকাল কনসোলটি সাধারণত উন্নত কম্পিউটার ব্যবহারকারীরা ব্যবহার করেন যা "যে কোনও কী" সঠিকভাবে ব্যাখ্যা করবে। অ্যাপল 2 ডিজাইনের ম্যানুয়াল, বেশ পুরানো, এই বিষয়ে একটি আকর্ষণীয় বিভাগ উত্সর্গ করা হয়েছে ( আপেল 2scans.net/files/1982-A2F2116-m-a2e-aiiedg.pdf )।
জেলওয়েলার

3
যদি আপনি পরিবর্তে বার্তাটি ব্যবহার করেন Press a key to continue...তবে নবীন ব্যবহারকারীরাও aকীটি খুঁজে পেতে এবং এটি টিপতে সক্ষম হবেন ; ও)
ডিজেড্যাভমার্ক

1
এতে command | myscript.shবা এর সাথে সমস্যা হবে myscript.sh | command। সমাধানের জন্য এই উত্তরটি দেখুন ।
টম হ্যালে

যদি কেউ read: 1: read: Illegal option -nআপনার কমান্ড bash -c 'command && command'ইত্যাদি গুটিয়ে রাখার বিষয়ে নিশ্চিত হন তবে ত্রুটিটি সম্ভবত রয়েছে sh। আমি ল্যান্ডো র‍্যাপার কমান্ডে এটি করছি।
এলিজা লিন

155

আমি এই উপায়গুলি অনেক সংক্ষিপ্তভাবে ব্যবহার করি এবং এগুলি @ থেমেমেডগুই এবং @ জিম সলিউশনগুলির মতো তবে সময়সীমা ও নিঃশব্দ মোড ছাড়াও।

আমি বিশেষ করে গত কেস ভালবাসেন এবং স্ক্রিপ্ট অনেকটা এটি ব্যবহার করে যা ব্যবহারকারী ছাপাখানা পর্যন্ত লুপ রান Enter

কমান্ড

  • সমাধান লিখুন

    read -rsp $'Press enter to continue...\n'
  • সমাধানের সমাধান (-d $ '\ ই' সহ)

    read -rsp $'Press escape to continue...\n' -d $'\e'
  • যে কোনও মূল সমাধান (-n 1 সহ)

    read -rsp $'Press any key to continue...\n' -n 1 key
    # echo $key
  • পূর্বনির্বাচিত পছন্দ সহ প্রশ্ন (-আইই 'ওয়াই' সহ)

    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
  • সময়সীমা সমাধান (-t 5 সহ)

    read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
  • ঘুম বর্ধিত ওরফে

    read -rst 0.5; timeout=$?
    # echo $timeout

ব্যাখ্যা

-r কাঁচা মোড নির্দিষ্ট করে, যা "\" বা "^" এর মতো সম্মিলিত অক্ষরগুলিকে মঞ্জুরি দেয় না।

-s নিঃশব্দ মোড নির্দিষ্ট করে এবং কারণ আমাদের কীবোর্ড আউটপুট লাগবে না।

-p $ ' প্রম্পট ' যা স্পেস দিন এবং অক্ষর পলান থেকে $ 'এবং' মধ্যে হতে হবে তা নির্দিষ্ট প্রম্পট। সতর্কতা অবলম্বন করুন, পালানো অক্ষরগুলির উপকারের জন্য আপনাকে অবশ্যই ডলার প্রতীক সহ একক উদ্ধৃতি প্রদান করতে হবে, অন্যথায় আপনি সাধারণ উদ্ধৃতি ব্যবহার করতে পারেন।

-d $ ' \ e ' এসকেপিকে ডিলিমিটার চরিত্র হিসাবে নির্দিষ্ট করে, সুতরাং বর্তমান প্রবেশের জন্য একটি চূড়ান্ত অক্ষর হিসাবে এটি কোনও অক্ষর স্থাপন করা সম্ভব তবে ব্যবহারকারী যে অক্ষরটি টাইপ করতে পারে সেটিকে রাখার ক্ষেত্রে যত্নবান হন।

-n 1 নির্দিষ্ট করে যে এর জন্য কেবল একটি একক অক্ষর প্রয়োজন।

- আমরা পঠন মোড নির্দিষ্ট করে।

-i Y ' Y ' ওয়াইডকে পঠন মোডে প্রাথমিক পাঠ হিসাবে নির্দিষ্ট করে।

-t 5 5 সেকেন্ডের সময়সীমা নির্দিষ্ট করে

আপনার কী ইনপুট জানতে হবে, -n1 ক্ষেত্রে, কীটি টিপানো হয়েছে তা জানুন।

$? শেষ প্রোগ্রামের প্রস্থান কোড জানতে পরিবেশন করুন, পড়ার জন্য, টাইমআউট করার ক্ষেত্রে 142, 0 সঠিক ইনপুট। Put? ভেরিয়েবলের যত তাড়াতাড়ি সম্ভব আপনার যদি কিছু কমান্ডের পরে এটি পরীক্ষা করা প্রয়োজন, কারণ সমস্ত কমান্ড পুনরায় লেখবে $?


1
ব্যাখ্যার জন্য +1 -s; man readএবং read --helpউবুন্টু 10.04.1 এলটিএসে সহায়তা করেনি। সম্পাদনা: help readকরেছেন; বাকি অবহেলিত হয়?
সিস টিমারম্যান

1
1+ দুর্দান্ত ব্যাখ্যার জন্য: তবে আমি read: -i: invalid optionপ্রাক্তন হয়েছি । read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;#osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;পরিবর্তে আমার জন্য কাজ করে। `
টিনো র‌্যাব

এটি ওএসএক্সে কীভাবে কাজ করে তা আমি জানি না তবে আমি কিছু পরীক্ষা করেছি এবং -iউবুন্টুতে পুরোপুরি কাজ করেছি , এছাড়াও আমি জানি না কীভাবে -dওএসএক্সে একইভাবে কাজ করা হয়।
y.petremann

পড়ার আগে প্রতিধ্বনি ব্যবহার করে প্রম্পটটি সত্যই দ্রুত এবং সুন্দর করে কাজ করা যায়, শেষ পর্যন্ত প্রতিধ্বনি করুন
THESorcerer

15

readকোনও পরামিতি ব্যতীত কেবলমাত্র আপনি এন্টার টিপলে চলতে থাকবে। pauseআপনি কোনও কী টিপলে ডস কমান্ডটি চলতে থাকবে। ব্যবহার করুন read –n1যদি এই আচরণ চাই।


15

এটি আমার জন্য লিনাক্সের একাধিক স্বাদে কাজ করেছে, যেখানে এই অন্যান্য সমাধানগুলির মধ্যে কিছু নেই (এখানে সর্বাধিক জনপ্রিয়গুলি সহ)। আমি মনে করি এটি আরও পাঠযোগ্য ...

echo Press enter to continue; read dummy;

নোট একটি পরিবর্তনশীল একটি আর্গুমেন্ট হিসাবে সরবরাহকৃত করা প্রয়োজন যে read


এই উত্তরটি আমার সমস্যার সমাধান করে, যদি আমি এই লাইনটি অনুলিপি করে আটকান এবং কোনও কারণে আমি আরও লাইন সংযোজন করি তবে সংযুক্ত লাইনগুলি কার্যকর হয় না, যেমন ডস বিরতির সাথে ছিল
সেরজিও

10

read -n1বহনযোগ্য নয়। এটি করার একটি বহনযোগ্য উপায় হতে পারে:

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

ব্যবহারের পাশাপাশি read, কেবল একটি প্রেসের ENTERজন্য প্রম্পট চালিয়ে যেতে আপনি করতে পারেন:

sed -n q </dev/tty

2
status=noneপোর্টেবল হয় না। পরিবর্তে stdout এবং stderr / dev / null এ পুনঃনির্দেশ করুন। read -r line < /dev/ttyজন্য যথেষ্ট হবে এন্টার টিপুন ...
স্টিফেন চেজেলাস

@ স্টাফেন চেজলস ধন্যবাদ - আমি তা জানি না। অসুস্থ এখন এটি ঠিক করুন। আবার ধন্যবাদ - স্থির। আপনি যাইহোক, সার্থক তথ্য একটি নিরবচ্ছিন্ন ভাল।
মাইকজারভেজ

1
settings=$(stty -g); stty raw; dd ...; stty "$settings"টিটিটি সেটিংস সংরক্ষণ এবং পুনরুদ্ধার করতে নোট করুন ।
স্টিফেন চেজেলাস

@ স্টাফেনচিজলস - আমি কম্পিউটারে নেই - আপনি কি ভাবেন যে trসম্পাদনা জিনিসটি খুব কার্যকর হতে পারে?
মাইকসার্ভ

1
না, কারণ trএর আউটপুটটিকে এটি একটি পাইপ হিসাবে বাফার করবে এবং ইউএস-বহির্ভুত কীবোর্ডগুলির এমন কী রয়েছে যা \1-\177সীমার বাইরে অক্ষর প্রেরণ করে । ddএখানে মূর্তিযুক্ত উপায়।
স্টিফেন চেজেলাস

2

আপনার যদি কেবল একটি লুপ বা স্ক্রিপ্ট বিরতি দেওয়া প্রয়োজন হয় এবং আপনি কোনও কীগুলির পরিবর্তে এন্টার টিপুন খুশি হন, তবে readকাজটি নিজে থেকেই এটি করবে।

do_stuff
read
do_more_stuff

এটি শেষ ব্যবহারকারী হিসাবে বন্ধুত্বপূর্ণ নয়, তবে আপনি নিজের জন্য একটি দ্রুত স্ক্রিপ্ট লিখছেন এমন ক্ষেত্রে যথেষ্ট হতে পারে এবং ব্যাকগ্রাউন্ডে ম্যানুয়ালি কিছু করার জন্য আপনাকে এটিকে বিরতি দিতে হবে।


এটি সত্য, তবে ডাটাবেসের জন্য এটি উদাহরণ দেখানো সবচেয়ে সহায়ক।
এসডসোলার

ধন্যবাদ, আমি আপনার পরামর্শ বোর্ডে নিয়েছি। কেবল কমান্ডের নাম লিখতে পারাপারে খুব স্পষ্ট নয়।
mwfearnley

1

এটা চেষ্টা কর:

function pause(){
   read -p "$*"
}

1
কেউ দয়া করে ব্যাখ্যা করতে পারেন কেন এটিকে নিম্নমানের করা হয়েছে? এটি কি সামগ্রীর অভাবে বা এটি একটি খারাপ সমাধান?
3ocene

4
@ 3ocene এটি তৈরি করা ফাংশনের ব্যবহার দেখায় না; প্লাস এটি কোন ব্যাখ্যা অভাব।
পারভাস

একমত। আপনি কীভাবে এই ফাংশনটি চালিত হয়েছে তার একটি উদাহরণ দেখাতে পারেন?
এসডসোলার

1

এই ফাংশনটি উভয় কাজ করে bashএবং zsh, এবং টার্মিনালে নিশ্চিত ইনপুট / আউটপুট:

# Prompt for a keypress to continue. Customise prompt with $*
function pause {
  >/dev/tty printf '%s' "${*:-Press any key to continue... }"
  [[ $ZSH_VERSION ]] && read -krs  # Use -u0 to read from STDIN
  [[ $BASH_VERSION ]] && </dev/tty read -rsn1
  printf '\n'
}
export_function pause

এটিকে আপনার .{ba,z}shrcমহান বিচারের জন্য রাখুন !


0

হ্যাঁ ব্যবহার করার জন্য read- এবং কয়েকটি টুইট রয়েছে যা এটি উভয় cronএবং টার্মিনালের মধ্যে সবচেয়ে কার্যকর করে তোলে ।

উদাহরণ:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

-N 120 2 মিনিটের পরে পঠন বিবৃতিটি সময় করে দেয় যাতে এটি ব্লক হয় না cron

টার্মিনালে এটি rsyncকমান্ডটি কার্যকর করতে কতক্ষণ সময় নেয় তা দেখতে 2 মিনিট সময় দেয় ।

তারপরে echoপরবর্তীটি তাই পরবর্তী ব্যাশ প্রম্পট পরবর্তী লাইনে উপস্থিত হবে।

অন্যথায় এটি Enterটার্মিনালে চাপলে "চালিয়ে যান ..." পরে সরাসরি একই লাইনে প্রদর্শিত হবে ।

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