Скрипт нормально работает в терминале, но не может работать через планировщик задач

1125 Я никогда не делал этого раньше, но видел это и чему-то научился. Вам нужно будет использовать функцию bash getopts следующим образом. Это должно указать вам правильное направление:

while getopts i:f:c:h:u: option
do
 case "${option}"
 in
 i) ip=${OPTARG};;
 f) state=${OPTARG};;
 c) cpu=${OPTARG};;
 h) host=$OPTARG;;
 u) user=$OPTARG;;
 esac
done

Это цикл while, который использует функцию getopts и так называемый optstring, в данном случае i:f:c:h:u:, для итерации аргументы. Цикл while проходит по optstring, который содержит флаги, которые можно использовать для передачи аргументов, и присваивает значение аргумента, предоставленное для этого флага, переменной option. Затем оператор case присваивает значение переменной option глобальной переменной, которая может использоваться после прочтения всех аргументов.

Двоеточия в optstring означают, что значения необходимы для соответствующих флагов. В приведенном выше примере за всеми флагами следует двоеточие: i:f:c:h:u:.

Это означает, что все флаги нуждаются в значении. Если, например, не ожидается, что флаги i и u будут иметь значение, строка опций будет i:f:c:h:u.

Двоеточие в начале строки опций, например :i:f:c:h:u:, имеет совершенно другое значение. Это позволяет вам обрабатывать флаги, которые не представлены в строке optstring. В этом случае значение переменной "option" устанавливается в "?" и значение «OPTARG» устанавливается на неожиданный флаг. Позволяет отобразить подходящее сообщение об ошибке, информирующее пользователя об ошибке.

Аргументы, которым не предшествует флаг, игнорируются getopts. Если флаги, указанные в строке опций, не предоставляются при вызове скрипта, ничего не происходит, если вы специально не обработаете этот случай в своем коде.

Любые аргументы, не обработанные getops, все еще могут быть зафиксированы с помощью обычных переменных $1, $2 и т. Д.

Простой пример:

#!/bin/bash

while getopts "i:f:c:h:u:" opt
do
        case $opt in
                i)
                        echo "ip"
                        ;;
                f)
                        echo "free"
                        ;;
                c)
                        echo "cpu"
                        ;;
                h)
                        echo "host"
                        ;;
                u)
                        echo "user"
                        ;;
                *)
                        echo "Nothing to do"
                        ;;
        esac
done

Использование:

./h.sh -i ip -f free -c cpu -h host -u user

Результат:

ip
free
cpu
host
user

Источник:

https: //www.lifewire.com/pass-arguments-to-bash-script-2200571

http://aplawrence.com/Unix/getopts.html

http://mywiki.wooledge.org/BashFAQ/035#getopts

http://mywiki.wooledge.org/ComplexOptionParsing

2
задан 17.04.2020, 14:55

1 ответ

Поскольку команда import захватывает часть или весь экран X-сервера, это означает, что она выполняет действия на вашем экране / дисплее, поэтому, когда вы используете ее в планировщике задач или в задании cron или что-то подобное, должен сначала установить значение переменной среды DISPLAY на :0.0. См. Графические переменные, связанные с рабочим столом , для получения дополнительной информации.

Итак, ваш скрипт должен выглядеть так:

#!/bin/bash
#Take screenshot
export DISPLAY=:0
import -window root $HOME/screenshot.png
#Move to dropbox folder
mv $HOME/screenshot.png $HOME/$(date|tr " :" _).png

Не забудьте сделать скрипт исполняемым, используя следующую команду:

chmod +x /path/to/script_name
0
ответ дан 17.04.2020, 14:55

Теги

Похожие вопросы