Lightshot печать экрана ключ обработчик для Linux - последующие #1


Этот вопрос является прямым продолжением #1 мой предыдущий вопрос:

Lightshot печать экрана ключ обработчик Линукс


Было слишком много ошибок, которые я не вижу на данный момент, и я старался исправить их сейчас. Я хотел бы кого-то другого (не себя) на самом деле проверить код на этот раз.


#!/bin/sh

# treat unset variables as an error when substituting
set -o nounset

#------------------------------------------------------------------------------

# global constants for an easy set-up
#
# lightshot_printscreen_hotkey: set this to the same hotkey which you have set up in Lightshot
#                               example: for left control and print screen key -> type Control_L+Print
lightshot_printscreen_hotkey="Print"

# lightshot_process_name: no need to change this one; it is a case-sensitive name of the Lightshot process
lightshot_process_name="Lightshot"

#------------------------------------------------------------------------------

print_error_and_exit()
# expected arguments:
# $1 = exit code
# $2 = error origin; usually function name
# $3 = error message
{
    # colors definitions
    bold=$(tput bold)
    red=$(tput setaf 1)
    yellow=$(tput setaf 3)
    nocolor=$(tput sgr0)
    bold_red="$bold$red"
    bold_yellow="$bold$yellow"

    # check if exactly 3 arguments have been passed
    # if not, print out an internal error without colors
    if [ "$#" -ne 3 ]
    then
        printf "print_error_and_exit() internal error\\n\\n\\tThere has been passed a wrong number of arguments (%b)! Expected 3:\\n\\t\\t1 - exit code\\n\\t\\t2 - error origin\\n\\t\\t3 - error message\\n\\nexit code = 2\\n" "$#" 1>&2
        exit 2
    fi

    # check if the first argument is a number
    # if not, print out an internal error without colors
    if ! [ "$1" -eq "$1" ] 2> /dev/null
    then
        printf "print_error_and_exit() internal error\\n\\n\\tThere has been passed the first argument as not a number (%b)!\\n\\tExpected an exit code.\\n\\nexit code = 2\\n" "$1" 1>&2
        exit 2
    fi

    # check if we have color support
    if [ -x /usr/bin/tput ] && tput setaf 1 > /dev/null 2>&1
    then
        # here we do have color support, so we highlight the error origin and the exit code
        printf "%b%b()\\n\\n\\t%b%b%b\\n\\nexit code = %b%b\\n" "$bold_yellow" "$2" "$nocolor" "$3" "$bold_red" "$1" "$nocolor" 1>&2
        exit "$1"
    else
        printf "%b()\\n\\n\\t%b\\n\\nexit code = %b\\n" "$2" "$3" "$1" 1>&2
        exit "$1"
    fi
}

#------------------------------------------------------------------------------

# expected arguments to the script: none
# check if no arguments have been passed to the script
[ "$#" -gt 0 ] && print_error_and_exit 1 "$0" "You have passed $# unexpected argument(s) to the script!\\n\\tNo arguments expected."

#------------------------------------------------------------------------------

check_for_prerequisite()
# expected arguments:
# $1 = program name
{
    # check if exactly one argument has been passed
    [ "$#" -eq 1 ] || print_error_and_exit 3 "check_for_prerequisite" "There has not been passed exactly one argument!\\n\\tA program name expected."

    # check if the argument is a program which is installed
    command -v "$1" > /dev/null 2>&1 || print_error_and_exit 4 "check_for_prerequisite" "I require $1 but it is not installed! Please install it."
}

#------------------------------------------------------------------------------

# check for prerequisites
check_for_prerequisite "pgrep"
check_for_prerequisite "xdotool"

#------------------------------------------------------------------------------

get_process_id_using_process_name()
# expected arguments:
# $1 = process name
{
    # check if exactly one argument has been passed
    [ "$#" -eq 1 ] || print_error_and_exit 5 "get_process_id_using_process_name" "There has not been passed exactly one argument!\\n\\tA process name expected."

    # try to get the process id using the process name
    pgrep "$1"
}

#------------------------------------------------------------------------------

is_number()
# expected arguments:
# $1 = any variable
{
    # check if exactly one argument has been passed
    [ "$#" -eq 1 ] || print_error_and_exit 6 "is_number" "There has not been passed exactly one argument!\\n\\tOne variable to test expected."

    # check if the argument is an integer number 
    [ "$1" -eq "$1" ] 2> /dev/null
}

#------------------------------------------------------------------------------

# try to get the Lightshot process id
lightshot_process_id=$(get_process_id_using_process_name "$lightshot_process_name")

# test if a process id has been successfully acquired
is_number "$lightshot_process_id" || print_error_and_exit 7 "lightshot_process_id" "The argument is not a number!\\n\\tLightshot is most probably not running."

#------------------------------------------------------------------------------

# get the window id from the Lightshot process id
    #--all   : Require that all conditions be met.
    #--limit : Stop searching after finding N matching windows.
    #--pid   : Match windows that belong to a specific process id.
    #--name  : Match against the window name. This is the same string that is displayed in the window titlebar.
lightshot_window_id=$(xdotool search --all --limit 1 --pid "$lightshot_process_id" --name "$lightshot_process_name")

# test if a window id has been successfully acquired
is_number "$lightshot_window_id" || print_error_and_exit 8 "lightshot_window_id" "The argument is not a number!\\n\\tLightshot is most probably not running."

#------------------------------------------------------------------------------

# simulate the above pre-defined print screen hotkey press on the Lightshot window
xdotool key --window "$lightshot_window_id" "$lightshot_printscreen_hotkey"


203
5
задан 13 апреля 2018 в 03:04 Источник Поделиться
Комментарии
1 ответ

Длинные строки тяжело читать

Это трудно читать:


printf "print_error_and_exit() internal error\\n\\n\\tThere has been passed a wrong number of arguments (%b)! Expected 3:\\n\\t\\t1 - exit code\\n\\t\\t2 - error origin\\n\\t\\t3 - error message\\n\\nexit code = 2\\n" "$#" 1>&2

Лучше было бы разбить на несколько echoзаявления.
Когда вы сделаете это, писать так, чтобы не использовать любые флаги echo,
не портативный.
Результат будет легче читать, и POSIX-совместимой.

При печати нескольких строк, иногда проще использовать здесь-документ.

Чтобы перенаправить вывод из нескольких команд, их можно сгруппировать в { ... }:

{
echo "foo"
echo "bar"
} >/dev/null 2>&1

Проверить наличие команды

Рекомендуемый способ проверить, если команда существует , кажется, через command -v name. Используя -x /usr/bin/tput накладывает более сильное ограничение, требуя программу в определенном месте. Что кажется ненужным.

Противоречие

print_error_and_exit использует tput для вычисления цвета,
и позже проверяет tput доступна.
Это не имеет смысла.

Избежать ненужных исполнения

В print_error_and_exit вычисляет цвета, выполняя tput,
но тогда она может выйти раньше на самом деле с помощью этих значений.
Так tput звонки должны быть перемещены вниз,
выполнять только когда вы уверены, что результаты будут полезны.

2
ответ дан 30 июня 2018 в 06:06 Источник Поделиться