Запуск программы в .profile предотвращает GUI startx

Вы можете использовать вариант трюка / dev / fd / 0 ] для передачи строки в сценарий, который ожидает имя файла:

php ./ScriptName.php php://fd/0 <<<'mywords'

Например, script.php содержит:


Запуск:

php script.php php://fd/0 <<<'Some text'

выводит:

Read: Some text

2
20.10.2016, 12:36
1 ответ

Ситуация такова, что вы начинаете с командной строки, а затем вызываете startx , когда будете готовы. Эмпирически вы полагаете, что графический интерфейс пытается повторно выполнить .profile , а сценарий python не может выйти, поэтому графический интерфейс зависает.

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

# This is .profile
#
if test -z "$DONE_PROFILE" -o "X$DONE_PROFILE" != "X${USER:-unknown}"
then
    # Protected code here will be called only once
    #
    echo "About to run keyboard polling"; sleep 3
    python /home/pi/poll_keyboard.py

    export DONE_PROFILE="${USER:-unknown}"
fi

Другой вариант - вызвать код, только если stdin подключен к терминалу:

# This is .profile
#
if test -t 0 -a -t 1
then
    # Protected code here will be called only if stdin and stdout is a tty
    #
    echo "About to run keyboard polling"; sleep 3
    python /home/pi/poll_keyboard.py
fi

Это второе предложение, вероятно, более безопасно, поскольку оно будет обрабатывать программы, которые входят в систему удаленно для запуска службы (например, rsync или scp ).

Вы даже можете объединить два, чтобы код учитывался только один раз, а затем выполнялся только в том случае, если stdin и stdout подключены к терминалу. (Просто вложите операторы if ... fi .)


Меня попросили объяснить условие test , которое защищает код в первом примере.

 if test -z "$ DONE_PROFILE" -o "X $ DONE_PROFILE"! = "X $ {USER: -unknown}" 
 

Это может быть записано на английском языке как " If $ DONE_PROFILE пуст или $ DONE_PROFILE не соответствует $ USER ... ".

Конструкция $ {USER: -unknown} заменяет unknown , если $ USER пусто или не задано.

В этом случае, вероятно, нет необходимости помещать X перед обеими сторонами выражения ! = , но это связано с защитным подходом к написанию сценариев.Рассмотрим переменную $ A со значением -z и другую переменную $ B со значением apple . В некоторых оболочках запись test "$ A"! = "$ B" будет заменена на test -z! = Apple , что синтаксически неверно. Добавление к обеим сторонам префикса X приведет к расширению test X-z! = Xapple , что является синтаксически безопасным.

2
27.01.2020, 22:10

Теги

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