কিছু প্রক্রিয়া শেষ হওয়ার অপেক্ষায় স্পিনার প্রদর্শন করুন


13

কমান্ড লাইন শেষ না হওয়া পর্যন্ত আমি স্পিনারকে কীভাবে দেখাতে পারি এটি কাজ? অন্য কথায়, যদি আমি কোনও স্ক্রিপ্ট চালাচ্ছি এবং এই স্ক্রিপ্টটি চলাকালীন আমি স্পিনারকে দেখাতে চাই এবং স্ক্রিপ্টটি কাজ শেষ হওয়ার পরে স্পিনার অদৃশ্য হয়ে যায়।

বেলো একটি সাধারণ স্পিনার কোড:

i=1
sp="/-\|"
echo -n ' '
while true
do
printf "\b${sp:i++%${#sp}:1}"
done

কমান্ডটি চলমান থাকাকালীন স্পিনারকে দেখাতে দেওয়ার জন্য এবং স্পিনার যখন কাজ শেষ হওয়ার পরে স্পিনার অদৃশ্য হয়ে যায় তখন আমি কীভাবে পূর্ববর্তী স্পিনার কোডটিকে একটি কমান্ডের সাথে যুক্ত করতে পারি? যদি আমি লুপের ভিতরে কমান্ডটি অন্তর্ভুক্ত করি তবে এটি স্পিনারের সাথে লুপ করবে তাই এই ক্ষেত্রে সমাধানটি কী?

bash 

উত্তর:


22

whileআপনার প্রকৃত আদেশটি প্রস্থান করার জন্য আপনার লুপ ওয়াচ রাখুন। আমি এমন একটি লিনাক্স পরিবেশ অনুমান করব যার প্রতিটি পিআইডি-র জন্য / প্রোক্রোম এন্ট্রি রয়েছে, তবে আপনি এটিকে অন্য উপায়ে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে ফেলতে পারেন:

#!/bin/bash
# your real command here, instead of sleep
sleep 7 &
PID=$!
i=1
sp="/-\|"
echo -n ' '
while [ -d /proc/$PID ]
do
  printf "\b${sp:i++%${#sp}:1}"
done

9
এটি একটি ব্যস্ত লুপ যা সিপিইউ সংস্থান খাবে। আমি আপনার সময় লুপ কিছুটা বিলম্ব করার পরামর্শ দিচ্ছি।
ACase

16

এই শেল স্ক্রিপ্টটি আপনি যা খুঁজছেন তা করা উচিত:

#!/usr/bin/env bash

show_spinner()
{
  local -r pid="${1}"
  local -r delay='0.75'
  local spinstr='\|/-'
  local temp
  while ps a | awk '{print $1}' | grep -q "${pid}"; do
    temp="${spinstr#?}"
    printf " [%c]  " "${spinstr}"
    spinstr=${temp}${spinstr%"${temp}"}
    sleep "${delay}"
    printf "\b\b\b\b\b\b"
  done
  printf "    \b\b\b\b"
}

("$@") &
show_spinner "$!"

ধরে নেওয়া যাক আপনি নামের একটি ফাইলে শেল স্ক্রিপ্ট সঞ্চয় করে রেখেছেন spinner, আপনি কমান্ড sleep 10চলাকালীন কোনও স্পিনার প্রদর্শন করতে এটির অনুরোধ করতে পারেন :

$ spinner sleep 10

এছাড়াও দেখুন স্ট্যাকওভারফ্লো.com
বিশপ

এটি ধরে নেয় শেল স্ক্রিপ্ট বলা হয় spinner, তাই না। আমি মনে করি উদাহরণটি সঠিক, আপনি ধরে নিচ্ছেন স্ক্রিপ্টটির নাম spinner
jsears

3

এখানে আরও একটি অভিনব স্পিনার যা আপনি এটির মতো ব্যবহার করতে পারেন:

spinner ping google.com
echo "ping exited with exit code $?"

spinner sleep 10
echo "sleep exited with exit code $?"

এটিতে 12 টি থিম রয়েছে এবং এলোমেলোভাবে একটি বাছাই করে।

#!/bin/bash
# Shows a spinner while another command is running. Randomly picks one of 12 spinner styles.
# @args command to run (with any parameters) while showing a spinner. 
#       E.g. ‹spinner sleep 10›

function shutdown() {
  tput cnorm # reset cursor
}
trap shutdown EXIT

function cursorBack() {
  echo -en "\033[$1D"
}

function spinner() {
  # make sure we use non-unicode character type locale 
  # (that way it works for any locale as long as the font supports the characters)
  local LC_CTYPE=C

  local pid=$1 # Process Id of the previous running command

  case $(($RANDOM % 12)) in
  0)
    local spin='⠁⠂⠄⡀⢀⠠⠐⠈'
    local charwidth=3
    ;;
  1)
    local spin='-\|/'
    local charwidth=1
    ;;
  2)
    local spin="▁▂▃▄▅▆▇█▇▆▅▄▃▂▁"
    local charwidth=3
    ;;
  3)
    local spin="▉▊▋▌▍▎▏▎▍▌▋▊▉"
    local charwidth=3
    ;;
  4)
    local spin='←↖↑↗→↘↓↙'
    local charwidth=3
    ;;
  5)
    local spin='▖▘▝▗'
    local charwidth=3
    ;;
  6)
    local spin='┤┘┴└├┌┬┐'
    local charwidth=3
    ;;
  7)
    local spin='◢◣◤◥'
    local charwidth=3
    ;;
  8)
    local spin='◰◳◲◱'
    local charwidth=3
    ;;
  9)
    local spin='◴◷◶◵'
    local charwidth=3
    ;;
  10)
    local spin='◐◓◑◒'
    local charwidth=3
    ;;
  11)
    local spin='⣾⣽⣻⢿⡿⣟⣯⣷'
    local charwidth=3
    ;;
  esac

  local i=0
  tput civis # cursor invisible
  while kill -0 $pid 2>/dev/null; do
    local i=$(((i + $charwidth) % ${#spin}))
    printf "%s" "${spin:$i:$charwidth}"

    cursorBack 1
    sleep .1
  done
  tput cnorm
  wait $pid # capture exit code
  return $?
}

("$@") &

spinner $!

2

আপনি যদি একটি সর্বনিম্ন সাধারণ ডিনোমিনেটর স্পিনার চান যা / bin / sh এর সাথে কাজ করে এবং বর্ধিত ব্যাশ প্যারামিটার বিকল্পের উপর নির্ভর না করে তবে এটি কাজ করা উচিত:

#!/bin/sh

# The command you are waiting on goes between the ( ) here
# The example below returns a non zero return code

(sleep 20 ; /bin/false) &

pid=$! ; i=0
while ps -a | awk '{print $1}' | grep -q "${pid}"
do
    c=`expr ${i} % 4`
    case ${c} in
       0) echo "/\c" ;;
       1) echo "-\c" ;;
       2) echo "\\ \b\c" ;;
       3) echo "|\c" ;;
    esac
    i=`expr ${i} + 1`
    # change the speed of the spinner by altering the 1 below
    sleep 1
    echo "\b\c"
done

# Collect the return code from the background process

wait ${pid}
ret=$?

# You can report on any errors due to a non zero return code here

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