Có cách nào để chỉ hiển thị một biểu tượng trong khi tập lệnh của tôi đang chạy không?


10

Tôi rất, rất mới với kịch bản. Đây là kịch bản đơn giản (hoạt động) mà tôi đã viết, hiển thị hình ảnh khi 5 phút trôi qua:

sleep 300 && firefox file:///home/tasks/fiveminutes.jpg

Đây là câu hỏi của tôi: đôi khi tôi không thể nhớ nếu tôi đã bắt đầu hẹn giờ. Có cách nào để thêm một chỉ thị văn bản hoặc biểu tượng (lý tưởng nhất là trên thanh tác vụ, nhưng bất cứ nơi nào cũng sẽ tuyệt vời) xuất hiện trong 5 phút (từ lúc tôi bắt đầu hẹn giờ đến khi tôi kết thúc nó)?

Cảm ơn rất nhiều cho bất kỳ đề nghị.


1
Bash không phải là cách tốt nhất để xử lý các chức năng của máy tính để bàn. Bạn có thể nhìn vào sự yên tĩnh hoặc yad, nhưng chúng không hoạt động tuyệt vời với chức năng ngủ. Nếu bạn cân nhắc sử dụng Python, thì đó sẽ là một tập lệnh rất đơn giản có thể sử dụng biểu tượng khay hệ thống GTK / wx.
Dorian

Đối với một giải pháp bash phức tạp hơn với sự thoải mái, bạn có thể xem mã này: github.com/john-davies/shellpomo/blob/master/shellpomo
Dorian

Xin chào Dorian - Cảm ơn rất nhiều vì những gợi ý của bạn. Tôi rất vui khi sử dụng Python, bạn có thể chỉ cho tôi cách hướng dẫn biểu tượng khay hệ thống GTK / wx không?
Hiền nhân.

Câu trả lời:


4

Bạn có thể hiển thị thông báo bật lên khi quá trình bắt đầu. Chỉ cần thay đổi tập lệnh của bạn thành

notify-send "Your image will arrive" "after 5 minutes" && sleep 300 && firefox file:///home/tasks/fiveminutes.jpg

Bạn có thể đặt thời lượng của bong bóng thông báo bằng -ttham số (và thời gian tính bằng mili giây) bằng notify-sendlệnh, ví dụ: để đặt thời lượng cho 5 phút sử dụng

notify-send -t 300000 "heading" "text"

nhưng tham số này có thể bị bỏ qua hoàn toàn tùy thuộc vào môi trường máy tính để bàn của bạn (xem phần này ).


Xin chào Pomsky, cảm ơn lời đề nghị của bạn. Thứ tôi đang tìm kiếm là thứ gì đó vẫn còn trên màn hình trong toàn bộ 5 phút.
Hiền nhân.

1
@Hiền nhân. Có một cách để đặt thời gian chờ cho bong bóng thông báo (xem chỉnh sửa thành câu trả lời), nhưng thật không may, nó có thể không hoạt động trong một số môi trường máy tính để bàn nhất định.
pomsky

Hi Pomsky - giải pháp thông báo-gửi -t hoạt động như một giấc mơ. Tôi thực sự đánh giá cao sự giúp đỡ của bạn.
Hiền nhân.

6

Nó đủ để có một kịch bản như vậy:

#!/usr/bin/env bash

while true
do
    if pgrep -f gedit > /dev/null
    then

       printf "\r%b" "\033[2K"
       printf "Script is running"
    else
       printf "\r%b" "\033[2K" 
       printf "Script is not running."
    fi
    sleep 0.25
done

Đây là một cách rất điển hình và thường được sử dụng trong các kịch bản shell. Cái này làm gì, đang chạy liên tục và cứ sau một phần tư giây nó sẽ kiểm tra xem tập lệnh của bạn có chạy qua không pgrep -f. if..ficác câu lệnh trong shell script hoạt động theo trạng thái thoát lệnh, vì vậy pgrep -ftrả về trạng thái thoát thành công có nghĩa là nó tìm thấy tiến trình của tập lệnh của bạn và nó đang chạy. Nếu không, chúng tôi đi đến tuyên bố khác.

Trong cả hai trường hợp, chúng tôi đều in một dòng văn bản cho người dùng biết nó có chạy hay không. Ngoài ra còn có thêm printf "\r%b" "\033[2K"để in một chuỗi thoát để xóa dòng (chỉ cho đầu ra sạch hơn).

Từ đó, bầu trời là giới hạn. Bạn có thể chuyển văn bản đó sang một quy trình khác trong thiết bị đầu cuối thông qua đường ống hoặc bạn có thể chuyển đầu ra từ tập lệnh giám sát sang bộ kiểm tra chỉ báo , cho phép hiển thị thông tin tùy chỉnh trong chỉ báo. Nó có thể được cài đặt thông qua

sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor
sudo apt-get update
sudo apt-get install indicator-sysmonitor

Sau đó, chỉ cần cấu hình chỉ báo để hiển thị một lệnh tùy chỉnh sẽ là tập lệnh giám sát. Ví dụ về cấu hình một lệnh tùy chỉnh có thể được tìm thấy ở đây .

Tất nhiên, người ta có thể viết chỉ báo của riêng họ bằng Python, nhưng điều này có thể chỉ là quá mức khi đã có công cụ cho việc đó.


1
indicator-sysmonitorNghe có vẻ hữu ích, tôi nên thử nó.
pa4080

6

Đây là trình khởi chạy Python, dựa trên câu trả lời này và một nghiên cứu bổ sung trên Internet, hoạt động tốt trong Ubuntu 16.04:

#!/usr/bin/env python3
import signal
import gi
import os
import subprocess
import sys
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread

# Execute the script
script = os.path.basename(sys.argv[1])
subprocess.Popen(sys.argv[1:])
script_name = script.rsplit('/', 1)[-1]

class Indicator():
    def __init__(self):
        self.app = 'Script indicator'
        iconpath = "/usr/share/unity/icons/launcher_bfb.png"

        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
        self.indicator.set_menu(self.create_menu())
        self.indicator.set_label("Script Indicator", self.app)
        # the thread:
        self.update = Thread(target=self.show_seconds)
        # daemonize the thread to make the indicator stopable
        self.update.setDaemon(True)
        self.update.start()

    def create_menu(self):
        menu = Gtk.Menu()
        # menu item 1
        item_quit = Gtk.MenuItem('Quit')
        item_quit.connect('activate', self.stop)
        menu.append(item_quit)

        menu.show_all()
        return menu

    def show_seconds(self):
        global script_name
        t = 0
        process = subprocess.call(['pgrep', script_name], stdout=subprocess.PIPE)
        while (process == 0):
            t += 1
            GObject.idle_add(
                self.indicator.set_label,
                script_name + ' ' + str(t) + 's', self.app,
                priority=GObject.PRIORITY_DEFAULT
                )
            time.sleep(1)
            process = subprocess.call(['pgrep', script_name], stdout=subprocess.PIPE)

        subprocess.call(['notify-send', script_name + ' ended in ' + str(t) + 's'])
        time.sleep(10)
        Gtk.main_quit()

    def stop(self, source):
        global script_name
        subprocess.call(['pkill', script_name], stdout=subprocess.PIPE)
        Gtk.main_quit()

Indicator()
# this is where we call GObject.threads_init()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
  • Nếu bạn thấy bất kỳ cách nào để cải thiện tập lệnh, xin vui lòng, đừng ngần ngại chỉnh sửa câu trả lời. Tôi chưa có nhiều kinh nghiệm với Python.

Tạo tập tin thực thi và đặt các dòng trên làm nội dung của nó. Giả sử tập tin được gọi script-indicator.py. Tùy thuộc vào nhu cầu của bạn và bản chất tập lệnh của bạn, bạn có thể sử dụng trình khởi chạy này theo một trong các cách sau:

./script-indicator.py /path/to/script.sh
./script-indicator.py /path/to/script.sh &
./script-indicator.py /path/to/script.sh > out.log &
./script-indicator.py /path/to/script.sh > /dev/null &
  • Đâu script.shlà một trong những bạn muốn chỉ ra.

Ảnh chụp màn hình được thực hiện ngay khi script.shkết thúc:

nhập mô tả hình ảnh ở đây

  • Click vào hình ảnh để xem một bản demo hoạt hình.

Ngoài ra, bạn có thể đặt tập lệnh vào /usr/local/binđể có thể truy cập dưới dạng hệ thống lệnh shell. Bạn có thể tải xuống từ GitHub Gist dành riêng này :

sudo wget -qO /usr/local/bin/script-indicator https://gist.githubusercontent.com/pa4080/4e498881035e2b5062278b8c52252dc1/raw/c828e1becc8fdf49bf9237c32b6524b016948fe8/script-indicator.py
sudo chmod +x /usr/local/bin/script-indicator

Tôi đã thử nó với cú pháp sau:

script-indicator /path/to/script.sh
script-indicator /path/to/script.sh &
script-indicator /path/to/script.sh > output.log
script-indicator /path/to/script.sh > output.log &
script-indicator /path/to/script.sh > /dev/null
script-indicator /path/to/script.sh > /dev/null &
nohup script-indicator /path/to/script.sh >/dev/null 2>&1 &
# etc...

2
Làm tốt lắm ! Đã được nâng cấp
Sergiy Kolodyazhnyy

4

Với osd_cat

Bạn có thể sử dụng osd_cattừ xosd-bin Cài đặt xosd-bingói, ví dụ:

<<<"runs" osd_cat -d5 -i20 -o50 -f"-*-*-*-*-*-*-100-*-*-*-*-*-*-*" && firefox

Điều này sẽ hiển thị các dòng chữ chạy với kích thước phông chữ 100trong 5vài giây tại vị trí 20,50trên màn hình và bắt đầu firefoxkhi nó sẵn sàng - bạn không cần sleepvới phương pháp này. Bạn có thể sử dụng xfontselđể có được Bộ mô tả phông chữ logic X (điều kỳ lạ này -*-*-…) cho -ftùy chọn, ví dụ: nếu bạn muốn sử dụng một phông chữ khác. Đọc man osd_catđể có thêm lựa chọn.

Với yad

Bạn có thể sử dụng yad Cài đặt yadnhư sau:

yad --title=runs --text="it’s running!" --timeout=5 --button=Fire:1 --button=Abort:0 || firefox

Điều này có lợi thế là bạn có thể hủy bỏ lệnh hoặc thực thi nó ngay lập tức, nếu bạn không làm gì thì nó sẽ đóng lại sau 5vài giây trong ví dụ này.


Hi Dessert - cảm ơn lời đề nghị của bạn. Thứ tôi đang tìm kiếm là thứ gì đó vẫn còn trên màn hình trong toàn bộ 5 phút.
Hiền nhân.

@Hiền nhân. cả hai làm điều đó, yadcửa sổ có thể được thu nhỏ, văn bản osd không thể.
tráng miệng

@Hiền nhân. Tôi đã thử nghiệm cả hai giải pháp được đề xuất và chúng hoạt động khá tốt.
pa4080

0

Bạn có thể lấy tập lệnh đã hoạt động nàymulti-timer và loại bỏ phần lớn tập lệnh cho đồng hồ đếm ngược chung:

quay pizza.gif

Nó sử dụng tương tự indicator-sysmonitorđược mô tả trong câu trả lời của Serge.

Phần Systray Brightness: 2344cũng được hiển thị bởi cùng một kịch bản.

Nếu việc loại bỏ các phần không cần thiết của mã bash là quá khó đối với người dùng mới, tôi rất vui lòng đăng một tập lệnh ở đây được gọi show-sleepvới chức năng giới hạn cần thiết. Chỉ cần đăng một bình luận dưới đây.

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.