Я хотел бы получать уведомление на рабочем столе всякий раз, когда команда, которая выполняется более 15 секунд, завершается в интерактивной оболочке.
Другими словами, я бы хотел, чтобы все команды были обернуты примерно так
start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"
Какой лучший способ сделать это в bash?
bash
notification
aioobe
источник
источник
Ответы:
Вам нужен https://launchpad.net/undistract-me (устанавливается из архивов Ubuntu с помощью
sudo apt-get install undistract-me
), который выполняет именно то, о чем вы просите, включая автоматическую работу (то есть без необходимости добавлять что-то дополнительное к потенциально долгим бегущие команды).источник
sleep 30
, но без уведомления..bashrc
:. /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install
. Кажется, это ошибка: github.com/jml/undistract-me/issues/23Насколько я понял, вы хотите обертку . И вы хотите использовать команду через нее, чтобы она выдала вам желаемое уведомление, если время выполнения вашей команды превышает 15 секунд. Так вот и все.
Скопируйте эту функцию в ваш
~/.bashrc
и источник~/.bashrc
как,Useage
Если это займет более 15 секунд, вы получите уведомление на рабочем столе, описывающее команду и время ее выполнения.
пример
источник
"$@"
Не$@
. Большая разница.wrapper
перед каждой командой, которую я печатаю все же.command; alert
на самом деле корочеwrapper command
:-)notify-send
чтобы срок действия истекал в течение длительного времени, укажите для уведомления-отправки настраиваемое время ожидания (в миллисекундах). напримерnotify-send --expire-time 999999999 ...
В
~/.bashrc
существует псевдоним,alert
определяемый как:который может быть использован для уведомления о завершении выполнения команды.
Использование:
например
Вы можете настроить псевдоним в соответствии с вашими потребностями и желаниями.
источник
Помимо обертки, подобной предложенной souravc, на самом деле нет хорошего способа сделать это в bash. Вы можете обойти это, используя ловушку DEBUG и PROMPT_COMMAND. Ловушка DEBUG срабатывает всякий раз, когда вы запускаете команду, и PROMPT_COMMAND запускается непосредственно перед написанием приглашения.
Так что вещи для
~/.bashrc
что-то вродеЭто хак, так что не удивляйтесь, если с этим столкнетесь со странными побочными эффектами.
источник
РЕДАКТИРОВАТЬ
TL; DR : создать ярлык автозаполнения в
.inputrc
и функцию в.bashrc
. Запустите команду как обычно, введите, но вместо ENTER, нажмите на ярлык, который вы указали в.inputrc
Человек, который назначил награду за этот вопрос, сказал:
При изучении решений этой проблемы я наткнулся на этот вопрос из stackexchange, который позволяет связать CtrlJпоследовательность команд: Ctrla(переместиться в начало строки), поместите строку «mesure» перед введенной вами командой Ctrlm(execute)
Таким образом, вы получаете функциональность автозаполнения и отдельную ENTERкоманду для измерения времени, сохраняя при этом первоначальное назначение второй функции, которую я разместил ниже.
На данный момент вот содержимое моего
~/.inputrc
файла:"\C-j": "\C-a measure \C-m"
И вот содержимое
.bashrc
(заметьте, я не использовал bash вечно - я использую mksh в качестве оболочки, поэтому вы видите это в оригинальном посте. Функциональность остается той же)Оригинальный пост
Вот моя идея - использовать функцию в
.bashrc
. Основной принцип - используйте,/usr/bin/time
чтобы измерить время, необходимое для выполнения команды, и, если оно превышает 15 секунд, отправьте уведомление.Здесь я перенаправляю вывод в,
/dev/null
но для просмотра вывода перенаправление в файл также может быть сделано.ИМХО, гораздо лучший подход - отправлять вывод времени в какой-то файл в вашей домашней папке (просто чтобы вы не загрязняли вашу систему временными файлами и всегда знали, где искать). Вот эта вторая версия
А вот скриншоты первой и второй версии, в таком порядке
Первая версия, нет вывода
Вторая версия, с выходом
источник
sudo lsof
и в основном сping -c20 google.com
.Я недавно создал инструмент, который служит этой цели. Он может быть запущен как оболочка или автоматически с интеграцией оболочки. Проверьте это здесь: http://ntfy.rtfd.io
Чтобы установить его:
Чтобы использовать его в качестве оболочки:
Чтобы получать уведомления автоматически, добавьте это в свой
.bashrc
или.zshrc
:источник
Ваш скрипт работает довольно хорошо, просто убедитесь, что вы включили строку 'shebang' (
#!/bin/bash
) . Другие,#!/bin/bash
которые упоминаются здесь , но в большинстве случаев#!/bin/bash
отлично работают для сценариев Unix bash. Это требуется интерпретатору сценария, чтобы он знал, какой это тип сценария.Это похоже на тестовый скрипт:
Чтобы изменить этот сценарий, поместите команду (ы) , где
echo
иsleep
линии есть.Обратите внимание
notify-send
, вы также можете-i
указать значок :-)Также убедитесь, что он исполняемый, запустив
chmod +x /PATH/TO/FILE
его сначала.источник
Вы можете изменить Bash для реализации нужной вам функциональности оболочки.
Если вы склонны делать много таких модификаций в вашей интерактивной оболочке, вы можете подумать о переключении на внутренне взломанную оболочку, например eshell, которая построена с использованием Emacs elisp и имеет все свои легендарные возможности настройки:
http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/
источник
Вы также можете сделать это с помощью простого оператора, как это
Вы можете использовать свои собственные имена переменных.
Я могу подтвердить, что это работает, я проверил с помощью команды, которая занимает много времени, а другая - нет, и уведомление приходит для команды, которая занимает много времени.
Вы также можете сделать это с любой командой, заменив
ORIGINAL_COMMAND
с$@
и запустить скрипт как./script command
.источник
$((2+2))
является встроенным в Bash, не требует никаких дополнительных программ. Третье: он не работает с командами, которые имеют пробелы. tl; dr: это хуже, чем другие ответы 1-летнего возраста