Sử dụng thanh lệnh trong bash mà không có I / O?


7

Tôi thực sự thích giao diện của bar

Nhưng tập lệnh đó chỉ được sử dụng cho các hoạt động Nhập / Xuất.

Làm thế nào tôi có thể sử dụng nó như một sự thay thế cho giấc ngủ nhưng với phản hồi trực quan?

sleep 10

Câu trả lời:


9

Tôi không thể thấy một cách để làm điều này bằng cách sử dụng bar. Tuy nhiên, bạn có thể quan tâm đến các lệnh khác làm điều tương tự, có thể đáp ứng nhu cầu của bạn tốt hơn.

Phương pháp số 1 - Giả mạo nó

Phương pháp này sẽ đơn giản ghi đè lên những gì đã được hiển thị trước đó trên màn hình với thanh tiến trình lớn hơn. Đơn giản mà hiệu quả.

Ví dụ ex.bash:

#!/bin/bash

echo -ne '#####                     (33%)\r'
sleep 1
echo -ne '#############             (66%)\r'
sleep 1
echo -ne '#######################   (100%)\r'
echo -ne '\n'

Phương pháp # 2 - xem trước

Lệnh pvcung cấp chức năng thanh tiến trình. Bạn có thể xem các ví dụ chi tiết hơn trong bài viết này có tiêu đề: Một tiện ích Unix bạn nên biết về: Trình xem ống .

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Phương pháp # 3 - spinner

Bạn có thể sử dụng mã mẫu sau để tạo "spinner" của riêng mình bằng cách sử dụng một vòng lặp đơn giản. Trong vòng lặp, bạn có thể nhúng bất kỳ lệnh nào bạn muốn. Mã này xuất phát từ bài viết này, có tiêu đề: Tôi có thể làm một spinner trong Bash không? .

#!/bin/bash

sp='/-\|'
printf ' '
for i in $(seq 3); do
  printf '\b%.1s' "$sp"
  sp=${sp#?}${sp%???}
  sleep 1
done
echo ''

Phương pháp số 4 - hộp thoại

Có một lệnh được gọi là dialogthực hiện khá nhiều những gì bạn muốn. Nó sử dụng các hộp thoại đồ họa, nhưng chúng dựa trên các nút để chúng hoạt động trong hầu hết mọi thiết bị đầu cuối và / hoặc tập lệnh miễn là có hỗ trợ cho các mật mã. Bạn có thể xem tất cả các dialogtài liệu trên trang web của dự án .

ảnh chụp màn hình

ss của câu nói

Người giới thiệu


Giới thiệu về phương pháp số 1 của slm , một ví dụ đầy đủ hơn: Progressbar.sh .
Alexandre

0

Nó có vẻ tầm thường để thực hiện. Hàm bash bên dưới (thanh) bên dưới hoạt động giống như bartập lệnh của bạn (dựa trên đoạn ghi hình ngắn). Nó cũng thay đổi kích thước linh hoạt với chiều rộng của thiết bị đầu cuối (trong cuộc gọi tiếp theo bar).

#!/bin/bash

#Helper functions
terminal_width(){
  local width_height=`stty size`
  echo ${width_height/* /}
}
string_times_n(){
  local s=$1
  local n=$2
  for((i=0;i<n; i++)); do echo -n "$s"; done
}
##The actual function
bar(){
  local percentage=$1
  local padding=10
  local width=$(echo "scale=0; 0.5 * $(terminal_width)" | bc | cut -d. -f1)
  local equals_n=$(echo "$percentage * $width / 100" | bc | cut -d. -f1)
  local dots_n=$((width - equals_n))

  #ANSI escape sequence magic
  local Esc="\033["
  local up="$Esc""K""$Esc""1A""$Esc""K"

  #Clear the line
  string_times_n ' ' "$width"
  echo -ne "\r"

  #Print the current screen
  printf  "%3s%% [" "$percentage"
    string_times_n '=' "$equals_n"
    string_times_n '.' "$dots_n"
  echo -n "]"

  #Go up unless finished
  if [[ "$percentage" == 100 ]] 
  then
    echo
  else
    echo -e "$up"
  fi
}

Sử dụng

. bar.sh #Assuming it's saved in bar.sh
bar $percentage

Ví dụ tiến độ thường xuyên:

for i in {1..10}; do bar $((i*10)); sleep 0.1; done;

Ví dụ tiến độ ngẫu nhiên:

for i in {1..10}; do bar $((i*10)); sleep `echo $RANDOM / 10000|bc`; done;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.