कुछ प्रक्रिया समाप्त होने की प्रतीक्षा करते हुए स्पिनर प्रदर्शित करें


13

मैं कमांड लाइन खत्म होने तक स्पिनर कैसे दिखा सकता हूं यह काम है? दूसरे शब्दों में, अगर मैं एक स्क्रिप्ट चला रहा हूं और मैं स्पिनर दिखाना चाहता हूं जबकि यह स्क्रिप्ट चल रही है और स्क्रिप्ट खत्म होने पर स्पिनर गायब हो जाता है।

Bellow एक सामान्य स्पिनर कोड है:

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

मैं कमांड को पिछले स्पिनर कोड को कमांड से कैसे जोड़ सकता हूं, जबकि कमांड चल रहा है और स्पिनर गायब हो जाता है जब कमांड खत्म हो जाती है तो यह काम है? यदि मैं लूप के अंदर कमांड शामिल करता हूं तो यह स्पिनर के साथ लूप करेगा ताकि इस मामले में क्या समाधान हो?

bash 

जवाबों:


22

whileअपने वास्तविक आदेश से बाहर निकलने के लिए अपनी लूप वॉच लें। मैं एक लिनक्स वातावरण मानूंगा जिसमें प्रत्येक PID के लिए प्रविष्टियाँ हैं / खरीद सकते हैं, लेकिन आप इसे अन्य तरीकों से स्लाइस कर सकते हैं:

#!/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

यह भी देखें stackoverflow.com/a/20369590/2908724
बिशप

यह शेल स्क्रिप्ट को कहा जाता है 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

# 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}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.