Почему этот скрипт bash при чтении строкового кода выдает мне ошибки?

Расширение уже данного ответа.

Если вы попытаетесь запустить скрипт из сеанса screenили tmux, вам нужно сначала найти правильный $DBUS_SESSION_BUS_ADDRESSи передать его в качестве аргумента для dbus-monitorвместо --session. Кроме того, если вы запускаете его как демон, вы должны убедиться, что одновременно работает только один экземпляр (, например. с файлом блокировки )и что скрипт очищает после себя с помощью trap. Следующий пример будет работать как демон в большинстве современных сред Gnome (, протестированных в Ubuntu GNOME 16.04):

#!/bin/bash
set -o nounset                # good practice, exit if unset variable used

pidfile=/tmp/lastauth.pid     # lock file path
logfile=/tmp/lastauth.log     # log file path

cleanup() {                   # when cleaning up:
    rm -f $pidfile            # * remove the lock file
    trap - INT TERM EXIT      # * reset kernel signal catching
    exit                      # * stop the daemon
}

log() {                       # simple logging format example
    echo $(date +%Y-%m-%d\ %X) -- $USER -- "$@" >> $logfile
}

if [ -e "$pidfile" ]; then    # if lock file exists, exit
    log $0 already running...
    exit
fi

trap cleanup INT TERM EXIT    # call cleanup() if e.g. killed

log daemon started...

echo $$ > $pidfile            # create lock file with own PID inside

# usually `dbus-daemon` address can be guessed (`-s` returns 1st PID found)
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s dbus-daemon)/environ)

expr='type=signal,interface=org.gnome.ScreenSaver' # DBus watch expression here

dbus-monitor --address $DBUS_SESSION_BUS_ADDRESS "$expr" | \ 
    while read line; do
        case "$line" in
            *"boolean true"*) log session locked;;
            *"boolean false"*) log session unlocked;;
        esac
    done

cleanup # let's not leave orphaned lock file when the loop ends (e.g. dbus dies)

Если это не работает для вас, это, вероятно, потому, что:

  1. вы не используете Gnome -проверьте другие ответы, чтобы улучшить выражение для просмотра DBus.
  2. вы используете несколько линий DBus -проверьте подробности о том, как сделать определение PID детерминированным.

-1
26.05.2019, 06:57
1 ответ

Вам не хватает doneв цикле for, поэтому no )и прочее является частью цикла.

1
28.01.2020, 05:09

Теги

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