LINUX.ORG.RU

Подскажите по простому скрипту bash

 


0

1

Всем привет, я недавно начал изучать bash, прошу не кидать помидоры:) В общем, хочу сделать скрипт, уводящий комп в спящий режим через промежуток времени, который задает пользователь через read. Сейчас имею следующее:

#!/usr/bin/bash
echo -n "Введите время отключения в минутах: "
read time
time_off=${time}m
sleep $time_off $$ systemctl suspend

Все работает, только терминал с работающим скриптом будет висеть до истечения заданного времени(При закрытии окна в спящий режим просто не переходит). Вопрос в следующем: как сделать так, чтобы терминал появлялся только для запроса значения времени и закрывался после этого?



Последнее исправление: Vishera845 (всего исправлений: 2)

Лучше используй posix-шелл (/bin/sh) а не баш. В твоём скрипте нет ничего такого чего posix-шелл не умеет.

Тебе надо увести скрипт в фон, для этого есть оператор &. Итого будет примерно так (последняя строчка):

( sleep $time_off && systemctl suspend ) &

Тут не учтён случай когда фоновые команды попытаются взаимодействовать с консолью (что-то выводить или читать из неё), потому что ни sleep ни systemctl suspend в норме это не делают. Если бы делали - нужны были бы дополнительные конструкции.

Учти, что если будешь вводить указанную команду вручную в интерактивный шелл - её надо обернуть дополнительно:

/bin/sh -c "( sleep $time_off && systemctl suspend ) &"
Иначе при некоторых действиях она может прерваться (например если закроешь окно крестиком а не ctrl-d или exit. Но внутри скриптов это не нужно.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от realbarmaley

Вообще в идеале я хочу, чтобы этот скрипт запускался по двойному щелчку с рабочего стола, но в таком случаем у меня не запускается скрипт в терминале, хотя назначен выполняемым. Наверно запускается в фоне, а мне надо ввести время

Vishera845
() автор топика
Ответ на: комментарий от kaldeon

Либо использовать другой подход. Как-нибудь запустить приложение без терминала, которое потом его запустит исключительно для запроса времени. Как-только пользователь ввёл время, терминал закрывается, скрипт продолжает работу.

Готовое решение предложить не могу 😁

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 1)

Подскажите *** – глагол повелительного наклонения, то есть, требование или даже приказ. Можете подсказать что-то? Это уже просьба.

как сделать так, чтобы терминал появлялся только для запроса значения времени и закрывался после этого?

Закрывая терминал вы завершите сессию командной оболочки, а скрипт работает именно в ней, то есть, завершит работу и сам скрипт. Получите такое:

user@linux:~$ qalc &
[1] 272580
user@linux:~$ 
exit
Есть остановленные задания.

[1]+  Остановлен    qalc
wonit
()
Ответ на: комментарий от Vishera845

Запускать или не запускать с клика по файлу (а рабочий стол это просто папка в файлменеджере) - настройка самого файлменеджера. Если такой настройки нет - для файлменеджера это просто текстовый файлик. Можно создать .desktop-файл (аналог ярлыка в винде) - эти при клике однозначно предназначены для запуска. Или создать кнопку запуска скрипта в панели (если панель позволяет).

kirill_rrr ★★★★★
()

хочу сделать скрипт, уводящий комп в спящий режим через промежуток времени, который задает пользователь через read

Хорошая идея! У меня получилось. Только проблема с тем, что терминалы (из тех что я пробовал) не умеют превращаться в отдельные wmclass, то есть не получится сделать красиво — либо будет дополняться к открытому терминалу, либо навязывать иконку терминала и т.д. В общем не проблема, для такой маленькой программы, которая не будет висеть открытой.

Не известно какой у тебя терминал, поэтому покажу пример на lxterminal (можешь его поставить и всё).

Допустим назовёшь скрипт my_suspend. Положи его в ~/.local/bin. Не забудь сделать исполняемым.

#! /bin/bash

> /tmp/sleep.txt
lxterminal --command 'read; echo $REPLY > /tmp/sleep.txt'
time_off=$(cat /tmp/sleep.txt)
if [[ -n $time_off ]]; then
	sleep ${time_off}m
	systemctl suspend
fi

Теперь ярлык. В каталог ~/.local/share/application создай файл my_suspend.desktop.

[Desktop Entry]
Name=my suspend
Icon=
Exec=my_suspend
Terminal=false
Type=Application
X-GNOME-SingleWindow=true
SingleMainWindow=true
StartupWMClass=Lxterminal

Может для кед ещё что-то надо добавить (у меня гном). В таком виде можно назначить свою иконку и она будет отображаться, когда запустишь программу.

Работает просто: если передумал спать, то просто закрой программу или нажми Enter. Как видишь в скрипте нет никаких проверок на корректность данных, так что не пиши туда ничего кроме цифр (ну ты понял 😀).

В любом случае, думаю, хорошая болванка для начала (мне бы и так сошло). Поменяй там всё как тебе больше нравится: название скрипта, название десктоп-файла, название программы и подставь свою иконку.

papin-aziat ★★★★★
()
Ответ на: комментарий от Vishera845

Там ещё проблема: предполагается, что sleep.txt не существует для какой-нибудь другой программы. Мне кажется такое маловероятно, но можешь на всякий случай назвать этот файл как-нибудь позаковырестей ☺️

А лучше его в хомяк перенеси да и всё.

papin-aziat ★★★★★
()
Последнее исправление: papin-aziat (всего исправлений: 1)