চালিয়ে যাওয়ার জন্য স্পেস টিপুন


73

কোনও ব্যবহারকারী চাপ না দেওয়া পর্যন্ত আমি কীভাবে বাশ স্ক্রিপ্ট থামাব Space?

আমি আমার স্ক্রিপ্টে এই প্রশ্নটি করতে চাই

চালিয়ে যাওয়ার জন্য বা প্রস্থান করতে CTRL+ চাপুনC

এবং তারপরে স্ক্রিপ্টটি থামানো উচিত এবং স্পেস টিপে না হওয়া পর্যন্ত অপেক্ষা করা উচিত।


এই এবং আরও অনেক কিছু এই এসও প্রশ্নোত্তর বিটিডব্লিউতে সম্বোধন করা হয়েছে: ডস বিরতির সমান
slm


উত্তর:


58

আপনি ব্যবহার করতে পারেন read:

read -n1 -r -p "Press space to continue..." key

if [ "$key" = '' ]; then
    # Space pressed, do something
    # echo [$key] is empty when SPACE is pressed # uncomment to trace
else
    # Anything else pressed, do whatever else.
    # echo [$key] not empty
fi

12
টার্মিনালে চাপানো অক্ষরটি প্রিন্ট না করার জন্য আপনাকে যুক্ত করতে হবে। এবং শেষে একটি লাইনব্রেক যুক্ত করুন, বা আউটপুট প্রশ্নের মতো একই লাইনে সরাসরি চালিয়ে যাবে। সেরা হবে:read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
রুব্বো

1
এই স্ক্রিপ্টটি কাজ করে না। এটি কেবল রেড হ্যাট লিনাক্সে পরীক্ষা করা হয়েছে ... elseব্লকটি সর্বদা চালিত হয়, এমনকি স্পেসবারটি চাপলেও।
রবার্ট

3
@ আরবার্ট এটি কারণ আপনি ব্যবহার করবেন না bash। আপনি যদি এর read _পরিবর্তে অন্য কোনও শেল ব্যবহার করেন তবে এটি ব্যবহার করে bash
নিক্লাস রোসক্র্যান্টজ

করা উচিত ''ভিতরে একটি স্থান থাকে?
জোসে আন্তোনিও ডুরা ওলমোস

এটি ''একটি খালি স্ট্রিংয়ের জন্য। ভিতরে কোনও জায়গা নেই। আমার ধারণা, আপনি এন্টার বা
ট্যাবে

44

এই SO প্রশ্নোত্তর আলোচিত পদ্ধতিটি সম্ভবত pauseবিএটি ফাইলগুলি করার সময় আপনি উইন্ডোজটিতে যে আচরণের অভ্যস্ত হন তার বিকল্পের জন্য সম্ভবত সেরা প্রার্থী ।

$ read -rsp $'Press any key to continue...\n' -n1 key

উদাহরণ

এখানে আমি উপরেরটি চালিয়ে যাচ্ছি এবং তারপর কেবল কোনও কী টিপব, এই ক্ষেত্রে Dকীটি।

$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$ 

তথ্যসূত্র


আমি বলতে চাচ্ছি কেন $এখানে স্ট্রিং আগে: -rsp $'Press?
রুবো 77

2
@ রুবো 77 - আহ। এইভাবে আপনি বিশেষ অক্ষর সহ আক্ষরিক স্ট্রিং করতে পারেন। এটি ফর্মের: $ '...'
স্ল্যাম

1
@ রুবো -। - এটি আলাদা। এটি ডলার সাইন ডাব্লু / ডাবল উদ্ধৃতি, আমি ডলার ডাব্লু / একক উদ্ধৃতি ব্যবহার করেছি। দয়া করে মন্তব্যটি মুছুন, এটি ভুল।
slm

1
আহ আমি বুঝতে পেরেছি. যদি আপনি প্রম্পট-স্ট্রিংয়ের মধ্যে পালানো সিকোয়েন্স রাখেন। দেখতে wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
rubo77

@ রুবো -। - হ্যাঁ যে স্বরলিপিটি এড়ানোর সিকোয়েন্সগুলিকে w / o কোনও অতিরিক্ত echo -e "..."লাইন অন্তর্ভুক্ত করতে দেয় । এই পরিস্থিতিতে এটি অনেক বেশি সংক্ষিপ্ত।
slm

6
hold=' '
printf "Press 'SPACE' to continue or 'CTRL+C' to exit : "
tty_state=$(stty -g)
stty -icanon
until [ -z "${hold#$in}" ] ; do
    in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
done
stty "$tty_state"

এটি এখন কোনও পূর্ববর্তী নিউলাইন ছাড়াই একটি প্রম্পট মুদ্রণ করে, CTRL+Cনির্ভরযোগ্যভাবে পরিচালনা করে , sttyকেবল যতবার প্রয়োজন ততবার আহ্বান জানায় এবং নিয়ন্ত্রণকারী টিটিটি ঠিক সেই স্থানে পুনরুদ্ধার করে যা sttyএটি খুঁজে পেয়েছিল। দেখব man sttyকিভাবে স্পষ্টভাবে প্রতিধ্বনি, নিয়ন্ত্রণ অক্ষর এবং সব নিয়ন্ত্রণ করতে তথ্যের জন্য।

আপনি এটিও করতে পারেন:

printf "Press any key to continue or 'CTRL+C' to exit : "
(tty_state=$(stty -g)
stty -icanon
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
stty "$tty_state"
) </dev/tty

আপনি এটি পরীক্ষা ENTER, না এবং মত মত করতে পারে:[]stty

sed -n q </dev/tty

5

আপনি এটির জন্য একটি ফাংশন তৈরি করতে পারেন:

pause(){
 read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}

তারপরে আপনি এটিকে আপনার স্ক্রিপ্টের যে কোনও জায়গায় ব্যবহার করতে পারেন:

pause

আপনি যদি শেল স্ক্রিপ্টিংয়ে নতুন হন - এটি ব্যবহারের আগে আপনার স্ক্রিপ্টের শীর্ষে ফাংশনটি রাখা দরকার
রিচার্ড

3

অলস ওয়ান লাইনার:

echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh

অসুবিধাটি হ'ল ব্যবহারকারী সিটিআরএল + সি চাপলে আপনি নিয়ন্ত্রণ হারাবেন। সেক্ষেত্রে স্ক্রিপ্টটি সর্বদা 130 কোড সহ প্রস্থান করবে।


2

IFSখালি স্ট্রিংয়ের সেটিংস সাদা জায়গার ছাঁটাইয়ের পড়ার ডিফল্ট আচরণকে দমন করে।

try_this() {
  echo -n "Press SPACE to continue or Ctrl+C to exit ... "
  while true; do
    # Set IFS to empty string so that read doesn't trim
    # See http://mywiki.wooledge.org/BashFAQ/001#Trimming
    IFS= read -n1 -r key
    [[ $key == ' ' ]] && break
  done
  echo
  echo "Continuing ..."
}
try_this

আপডেট 2018-05-23: আমরা REPLY ভেরিয়েবলটি ব্যবহার করে এটি সহজ করতে পারি, যা শব্দ বিভাজনের বিষয় নয়:

try_this() {
  echo -n "Press SPACE to continue or Ctrl+C to exit ... "
  while true; do
    read -n1 -r
    [[ $REPLY == ' ' ]] && break
  done
  echo
  echo "Continuing ..."
}
try_this

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মহান বিচারের জন্য রাখুন !

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