чтение результата команды bash

Раньше я использовал «execute_command», найденный в прежней замечательной вики. Эта команда использует io.popen и метод lines для возврата результата команды.
Совет доктора: избегать io.popen.

Мой rc.lua использует io.popen для назначения имени компьютера переменной ordinateur (я пытаюсь поддерживать уникальный rc.lua для двух совершенно разных компьютеров).

Раньше у меня была эта строка: ordinateur=execute_command("hostname"). Я заменяю ее на:

awful.spawn.easy_async_with_shell( "hostname" ,    
   function(stdout,stderr,reason,exit_code)
       ordinateur = stdout                                                      
   end)

Далее в скрипте у меня есть тесты типа если ординатур == "асус" то.... Но не проходит. На самом деле ordinateur равен нулю
Я думаю, что rc.lua читается до того, как ordinateur получает свое назначение, верно?

Так что я могу сделать ? Я думаю заменить команду чтением файла /etc/hostname, так лучше? Как мне это сделать с помощью команды awesome.spawn.*?

Спасибо
Дэвид


person david    schedule 15.03.2018    source источник
comment
Это должно быть допустимым использованием io.popen. Вы можете игнорировать документы здесь.   -  person Uli Schlachter    schedule 17.03.2018


Ответы (2)


Если есть возможность, используйте LuaSocket.

> socket = require "socket"
> print(socket.dns.gethostname())
myhost

Другой вариант — запустить hostname из сценария, запускающего оконный менеджер, и сохранить результат в переменной среды. Кто знает, если вам повезет, он уже там?!

> print(os.getenv("HOSTNAME") or os.getenv("HOST"))
myhost
person Mike Andrews    schedule 15.03.2018
comment
На самом деле я получаю nil, используя os.getenv, и я не хочу создавать переменную среды. Поэтому я выбираю ваше решение LuaSocket. Я разместил ваш код в верхней части моего rc.lua, и он выполняет свою работу! Спасибо! - person david; 15.03.2018
comment
lhf, это здорово - я добавил это в ответ. Дэвид, рад, что решение LuaSockets сработало для вас! - person Mike Andrews; 16.03.2018

Позже в сценарии происходит сбой, поскольку команда является асинхронной. Это означает, что Awesome продолжает работать во время выполнения команды, а результат будет доступен позже.

В этом весь смысл не использовать io.popen. io.popen остановит все [связанное с X11, включая все приложения] на вашем компьютере во время его выполнения.

Вам нужно изменить свой код, чтобы все вещи, которые обращаются к ordinateur, делали это после обратного вызова. Самый простой способ сделать это — добавить этот код в функцию обратного вызова.

person Emmanuel Lepage Vallee    schedule 19.03.2018