Làm thế nào để nhận thông báo khi các lệnh của tôi được thực hiện


64

Tôi đang chạy một loạt các lệnh trên dòng lệnh mất khoảng hai mươi phút để hoàn thành. Tôi muốn xem một số loại thông báo trên máy Mac của mình khi những thông báo này kết thúc vì vậy tôi không cần phải giám sát thiết bị đầu cuối khi nó kết thúc. Có cách nào để làm việc này không?

$ svn update . && ant clean build start && *notify_me_somehow*

Chỉnh sửa :

Tôi có thể sử dụng xclocknhưng điều này có vẻ như một hack. Lý tưởng nhất là tôi có thể gửi thông báo ở bất cứ đâu, như điện thoại, màn hình, v.v.


2
Mặc dù bạn đang ở dòng lệnh, tôi nghĩ rằng câu trả lời ở đây thực sự là dành riêng cho Mac và không liên quan đến Unix / Linux. Đó là bởi vì tôi nghĩ rằng bạn có thể muốn sử dụng Growl và grownlnotify.

Đó không phải là một lệnh xây dựng, ít nhất là trên hộp của tôi.

growl.info Growl là chương trình được đề cập bởi @mattdm.
jsbillings

Câu trả lời:


58

(svn update . && ant clean build start && say done) || say error


1
Đây là một ví dụ tuyệt vời về việc sử dụng các toán tử shell &&để xâu chuỗi một số lệnh và kết hợp nó với một tập thể ||hoặc câu lệnh để đưa ra lỗi. +1 thực sự
bmike

2
Đẹp! Để có thể làm điều đó một cách nhanh chóng, tôi từ bỏ lỗi so với thông tin thành công và thêm bí danh toàn cầu vào zsh của tôi : alias -g sd='; say done'. Điều này có nghĩa là tôi chỉ phải thêm sdvào bất kỳ lệnh nào và tôi sẽ được thông báo.
wrtsprt

tốt đẹp và bây giờ tôi có vài thứ để chơi với
Marco Prins

Đã thử và cả thực hiện và lỗi luôn được nói :( Ví dụ:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka

1
Rất tiện dụng. Tôi đã lặp lại với say -v Zarvoxđiều đó làm cho tất cả mọi người trong vùng lân cận nhảy lên, đây là một thông báo ít đáng báo động hơn.
Siddhartha

52

Trong Mac OS 10.8, bạn có thể tự gửi tin nhắn Trung tâm thông báo (tương tự như Growl nhưng được tích hợp trong Mac OS).

Kiểm tra " Gửi thông báo đến Trung tâm thông báo từ dòng lệnh trong OS X " để xem cách cài đặt đá quý Ruby cho phép bạn gửi thông báo từ dòng lệnh. Để đơn giản hóa trường hợp sử dụng phổ biến chỉ quan tâm đến thực tế của một cái gì đó trong thiết bị đầu cuối đang được thực hiện, hãy thêm bí danh vào .bash_profile của bạn:

alias notifyDone='terminal-notifier -title "Terminal" -message "Done with task!"'

Sau đó, bạn có thể chỉ cần làm:

$ <long-running task> ; notifyDone

Khi tác vụ chạy dài kết thúc, bạn sẽ nhận được một cửa sổ bật lên phương thức đẹp vẫn tồn tại cho đến khi bạn nhấp vào nó:

Trung tâm thông báo bật lên


10
trình thông báo đầu cuối cũng có thể được cài đặt qua homebrew : brew install terminal-notifier. Sau đó, bạn chỉ có thể viết myCommand && terminal-notifier -message 'finished'. Đã thử nghiệm trên OS X Yosemite (10.10.1).
Pwdr

4
Bạn nên chạy myCommand; terminal-notifier -message 'finished'nếu không thông báo sẽ không được hiển thị nếu myCommandthất bại.
aheuermann

1
Giải pháp tuyệt vời! Nhân tiện, điều này không tạo ra bất kỳ âm thanh như các thông báo OS X khác. Bất kỳ giải pháp cho điều đó?
SexyBeast 7/07/2015

1
@Cupidvogel bạn chỉ có thể thêm một saylệnh, ví dụ my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett

2
Nhiều câu trả lời cho câu hỏi này cung cấp thêm nhiều chi tiết: apple.stackexchange.com/questions/57412/iêu
Joshua Goldberg

20

Sử dụng Growl .

Trong .dmgtệp, tìm kiếm các tính năng bổ sung, có một nhị phân phát triển. Cài đặt nó, một cái gì đó giống như trong /usr/local/bin. Sau đó, bạn có thể sử dụng lệnh này

growlnotify --sticky --appIcon <icon> --message <message> -t <title>

để hiển thị một cửa sổ bật lên, như thế:

gầm gừ


2
Tôi sử dụng gần như phương pháp chính xác này nhưng tôi mở rộng Growl bằng Prowl để Growl có thể đẩy thông báo đến iPhone của tôi.
Ian C.

3
Trung tâm thông báo của Mountain Lion khiến Growl không cần thiết ... hãy xem câu trả lời của tôi để biết cách sử dụng nó cho việc này.
Tom Crockett

16

Kể từ Mac OS X Lion 10.7, Terminal có một số chỉ báo trạng thái mới để trợ giúp các vấn đề như sau:

Trong các tab:

  • Hoạt động: chỉ báo hoạt động (chỉ báo tiến trình quay) được hiển thị khi có đầu ra gần đây cho thiết bị đầu cuối. Điều này cho phép bạn xem liệu nó hiện đang bận hay đã hoàn thành một quá trình dài. (Hoặc, tất nhiên, bạn có thể sử dụng nó để biết khi nào nó đã bắt đầu tạo đầu ra sau khi âm thầm thực hiện công việc trong một thời gian.)

  • Chưa đọc: một dấu chấm lửng "'" được hiển thị để chỉ ra văn bản mới, chưa đọc trong các tab nền. Khi bạn chọn tab, chỉ báo sẽ bị xóa.

  • Thông báo: một "tiếng chuông" được hiển thị để cho biết khi nào một chữ BEL đã được ghi vào các tab nền hoặc cửa sổ nền. Ngoài ra, Terminal hiển thị huy hiệu màu đỏ trên biểu tượng ứng dụng, cho biết số lượng chuông / chuông "chưa đọc" trong tất cả các thiết bị đầu cuối. Nếu bản thân Terminal ở chế độ nền, nó cũng sẽ bật biểu tượng Dock khi phát chuông.

Trong các biểu tượng Dock cửa sổ thu nhỏ:

  • Hoạt động: hoạt động được chỉ định bằng cách hiển thị tên của quá trình tiền cảnh.

  • Chưa đọc: văn bản chưa đọc được chỉ định bằng dấu chấm lửng.

  • Cửa sổ đầu cuối thu nhỏ hiển thị nội dung trực tiếp trong các biểu tượng Dock của chúng. Điều này có thể được sử dụng để xem liệu có hoạt động hay thậm chí để xác định thiết bị đầu cuối đang làm gì, nếu đầu ra mà bạn đang tìm kiếm có thể nhận dạng được (ví dụ: màn hình "trên cùng" khá dễ nhận ra ngay cả ở kích thước nhỏ). Điều này đặc biệt hữu ích khi bật phóng đại Dock hoặc bạn có chỗ cho Dock lớn.

Ngoài ra, bạn có thể hiển thị một cái gì đó trong thiết bị đầu cuối để thu hút sự chú ý của bạn (có thể nhìn thấy ngay cả trong các cửa sổ thu nhỏ). Ví dụ:

  • Hiển thị một dấu sao lớn: banner \*

  • Đảo ngược màn hình: printf '\e[?5h'

  • Vẽ màn hình màu đỏ: tput setab 1; tput clear

  • Ngồi trong một vòng lặp, nhấp nháy màn hình: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Ngoài ra còn có mã thoát để thao tác với các cửa sổ (di chuyển, đặt kích thước, thu phóng, thu nhỏ, v.v.). Bạn có thể phóng to cửa sổ Terminal, ví dụ:

printf '\e[9;1t'

Xem "thao tác cửa sổ" tại http://invisible-island.net/xterm/ctlseqs/ctlseqs.html để biết chi tiết.

Một cách tiếp cận khác là sử dụng AppleScript để hiển thị cảnh báo trong một cửa sổ riêng biệt:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'

Sử dụng tuyệt vời các mục tiêu và thoát các chuỗi - bạn đã có mọi thứ ngoại trừ một thông báo cuộn trong thanh tiêu đề!
bmike

12

Tôi biết tôi đến trễ câu hỏi nhưng tôi nghĩ rằng có một phần còn thiếu có thể hữu ích. Tôi đã thấy rằng, trong khi nó gọn gàng, có thiết bị đầu cuối của bạn nói chuyện với bạn không chính xác chức năng. Những gì tốt hơn là một cái gì đó tinh tế hơn như thế này:

http://i.stack.imgur.com/FaZmF.png

Như Chris đã chỉ ra, Lion đã thêm một ít huy hiệu thông báo khi ném một chiếc BEL. Bạn có thể tự ném nó bằng lệnh này:

tput bel

Vì vậy, nếu bạn đang thực hiện một số công việc trong nền và muốn có thông báo khi kết thúc, bạn có thể thử một cái gì đó như:

ping -c 5 www.google.com && tput bel &

Điều này chạy lệnh ping như một tác vụ nền (treo và thực hiện điều này) và nó sẽ đưa ra một cảnh báo đơn giản khi nó kết thúc. Trong lịch sử, BEL đã được sử dụng để tạo ra tiếng bíp phần cứng [khủng khiếp], tuy nhiên Lion đã thay thế một cách trang nhã bằng hiệu ứng âm thanh "lệnh không hợp lệ", huy hiệu thông báo và biểu tượng đầu cuối nảy hai lần trong dock.


1
printf '\a'sẽ tương đương với tput bel. Lưu ý rằng Terminal không bật biểu tượng Dock nếu tab gây ra cảnh báo hiện đang hoạt động.
Lri

5

Tôi trình bày trong câu trả lời này hai điều:

  • Tùy chọn sử dụng afplay, phát các tệp âm thanh , để thông báo.
  • công cụ của tôi để báo cáo tình trạng thoát cùng với thông báo.

Tôi có kịch bản này , ~/bin/donebeep:

#!/bin/bash
if [ "$@" = 0 ]; then
  afplay -v 2 /System/Library/Sounds/Blow.aiff &
else
  afplay -v 2 /System/Library/Sounds/Sosumi.aiff &
fi

Điều này phát ra một âm thanh khác nhau tùy thuộc vào việc đối số có bằng 0. Sau đó tôi có bí danh:

alias donebeep='(savestatus=$?; ~/bin/donebeep $savestatus "$@"; exit $savestatus)'

(Rằng họ có cùng tên là không liên quan và có lẽ là một ý tưởng tồi.)

Để sử dụng nó trong ví dụ của bạn , svn update . && ant clean build start; donebeep. Lưu ý rằng tôi đang sử dụng ;chứ không phải &&, để nó có thể thông báo cho tôi về thất bại cũng như thành công.

Trước khi tôi biết vềafplay , tôi thường saynói chuyện với tin nhắn. Vai trò của donebeepkịch bản này:

#!/bin/bash
say -v Bruce "Done $(basename "$(pwd)"), $@." &

Kịch bản lệnh này nói mã thoát trực tiếp thay vì có hai thông báo khác nhau. Nó cũng đề cập đến tên của thư mục hiện tại (để giúp làm rõ nhiệm vụ nào được thực hiện) và có thể được cung cấp thêm văn bản để nói bằng cách chuyển tham số cho bí danh (đó là lý do tại sao bí danh có "$@"trong đó). Lưu ý dấu vết &để bạn không cần đợi bài phát biểu kết thúc trước khi nhận được lời nhắc.


Các trang người đàn ông choafplay là không đầy đủ; afplay -hliệt kê tất cả các tùy chọn:

Usage:
afplay [option...] audio_file

Options: (may appear before or after arguments)
  {-v | --volume} VOLUME
    set the volume for playback of the file
  {-h | --help}
    print help
  { --leaks}
    run leaks analysis  {-t | --time} TIME
    play for TIME seconds
  {-r | --rate} RATE
    play at playback rate
  {-q | --rQuality} QUALITY
    set the quality used for rate-scaled playback (default is 0 - low quality, 1 - high quality)
  {-d | --debug}
    debug print output

4

Bạn cũng có thể sử dụng lệnh build in say để thông báo, ví dụ: nói "ant: build: xong." Xem: người đàn ông nói trong thiết bị đầu cuối.



1

Tôi đã viết ntfycho chính xác mục đích này. Nó là đa nền tảng và có thể tự động gửi thông báo khi các lệnh chạy dài kết thúc.

Nếu bạn có Python pip(hầu hết các bản phân phối Linux và MacOS đều có), đây là cách cài đặt và bật thông báo tự động:

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

Kiểm tra nó tại http://ntfy.rtfd.io

Ngoài ra, nó cũng có thể:

  • thay thế thông báo tự động khi thiết bị đầu cuối ở phía trước (X11, iTerm2 & Terminal.app được hỗ trợ và bật theo mặc định)
  • gửi thông báo dựa trên đám mây (Pushover, PushbONS và XMPP)
  • được sử dụng để gửi thông báo khi một quá trình kết thúc (không phải là hỗ trợ tự động đã nói ở trên)
  • gửi thông báo theo cách thủ công (tốt để sử dụng trong tập lệnh!)

1

iTerm2 có một cơ chế tích hợp để nhận thông báo nhưng bạn phải cài đặt Shell Integration .

Khi bạn bắt đầu một lệnh chạy dài, chọn:
Chỉnh sửa> Dấu và chú thích> Cảnh báo> Thông báo về dấu tiếp theo ( ⌥Option+ ⌘Command+ A)

Khi dấu nhắc lệnh trả về, bạn có thể chọn giữa:

  • Hiển thị hộp cảnh báo phương thức
  • Đăng thông báo (ảnh chụp màn hình ví dụ)


0

Ubuntu gửi bí danh sau trong ~ / .bashrc:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

Với điều này, sau đó bạn có thể làm những việc như:

make; alert
sleep 10; alert

Có lẽ có một tương đương với notify-sendtrong Mac OSX? Tôi đã thấy Windows popup tương tự trong cả Mac và Ubuntu.


Bạn đang ở trên trang của Apple. Để làm cho câu trả lời này, vui lòng giải thích cách tải xuống notify-sendMac OS X.
Daniel Beck

4
Tôi đồng ý rằng điều này là không phù hợp, nhưng tôi thực sự thấy điều này hữu ích. Tôi đã đến câu hỏi này từ Google và câu hỏi ban đầu của tôi không dành riêng cho Mac. Giống như poster ban đầu, tôi muốn một cách để không phải giám sát thiết bị đầu cuối của mình khi chạy lệnh mất nhiều thời gian; Tôi
tình cờ

0

Vấn đề của tôi với âm thanh và cửa sổ phương thức là tôi không thể biết chúng đến từ đâu. Tôi hiện đang làm việc với một loạt các không gian, và đôi khi lên đến 20 cửa sổ đầu cuối.

Giải pháp của tôi là di động sang phía unix và nên hoạt động với bất kỳ thứ gì hỗ trợ chuỗi thoát ansi. Giải pháp này hoạt động với Snow Leopard, và có thể sẽ hoạt động với các phiên bản thiết bị đầu cuối cổ xưa hơn.

Một dòng trong .bash_profile

function watch { $* ; echo -n -e "\033[41m" ;  echo $* DONE ;  date ;  echo -n -e "\033[0m" ; }

Phá vỡ nó:

$* expands to the original command I want to watch.
first escape sequence changes background color to red
echo repeats the command (with red background, the word DONE.
Running Date tells you when it finished.
last escape resets the terminal to what it was.

Nếu bạn không thích màu đỏ, google ascii thoát mã màu nền. Lưu ý rằng điều này không thay đổi toàn bộ màn hình màu đỏ, mà chỉ là bất cứ thứ gì xuất ra sau khi lệnh kết thúc.


0

Tôi đã tạo ra một kịch bản để giải quyết điều này ở đây . Bạn không cần bất kỳ phần mềm bổ sung nào cho việc này. Cài đặt:
brew install akashaggarwal7/tools/tsay
Cách sử dụng:
sleep 5; tsay

Hãy đóng góp!


Lý do cho downvote?
Akash Agarwal

0

Đây là chức năng bash của tôi (chỉ cần đặt nó ở bất cứ đâu trong ~/.bashrchoặc ~/.zshrc:

watch(){
  cmd=$@ # Somehow interpolate $@ directly doesn't work.
  $@ && say 'Watch Completed!' && osascript -e "display notification \"Completed: $cmd\" with title \"Watch Alert\""
}

Để dùng nó: watch echo 'hi there'

Bạn cũng có thể tùy chỉnh âm thanh thông báo như được ghi lại ở đây: https://apple.stackexchange.com/a/115373/9622


0

Tôi làm điều đó mọi lúc. Dòng lệnh của tôi có thể trông giống như

$ rm Gemfile.lock && bin/setup && bundle install --binstubs && say "All"; say "done"

Nếu lệnh bin/setupbundle installhoàn thành thành công, tôi sẽ nghe giọng nói hệ thống / chính tả nói "Tất cả đã hoàn thành". Nếu một trong hai lỗi đầu tiên xảy ra, thì &&chuỗi sẽ không được theo dõi và tất cả những gì tôi nghe được là "Xong".


0

Bạn có thể sử dụng osascriptlệnh tích hợp để chạy Tập lệnh Apple hiển thị thông báo, ví dụ:

osascript -e 'display notification "Command done" with title "Your title here"'

Bạn có thể kết hợp nó với một dấu chấm phẩy đơn giản, vd

your-command ; osascript -e '....'
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.