Существует ли способ выполнить команды при получении ввода данных пользователем?

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

sudoedit (или его синоним sudo -e) режим sudo, где Вы редактируете временную копию файла в Вашем любимом редакторе, и та копия перемещена в место, когда Вы заканчиваете редактировать.

sudoedit /etc/fstab

Примечание: Существует несколько файлов, которые Вы не должны редактировать непосредственно.

Никогда не редактируйте /etc/sudoers непосредственно. Всегда используйте visudo команда для этого. Если Вы делаете ошибку в синтаксисе sudoers файла, Вы могли бы быть заблокированы из корневой учетной записи! Когда Вы работаете visudo, это позволяет Вам отредактировать временную копию файла и выполняет проверку синтаксиса прежде, чем заменить фактический файл Вашими редактированиями.

Тот же принцип относится к пользователю, группе, паролю пользователя и базам данных пароля группы, /etc/passwd, /etc/group, /etc/shadow, и /etc/gshadow, соответственно. В системах, где они доступны, используйте vipw, vigr команды для /etc/passwd и /etc/group. Для редактирования баз данных пароля передайте-s опцию. Например, для редактирования /etc/gshadow, использовать vigr -s.

3
25.10.2014, 19:14
2 ответа

Я нашел решение. По сути, вы запускаете петлю обновления на заднем плане и имеют основной цикл на переднем плане. Они могут общаться друг с другом, используя команды Trap / Kill.

Я загрузил файл .sh в Github, чтобы дать полный пример.

Вот модифицированный контур того, как он работает, хотя:

Примечание. Вы должны использовать Ctrl-C для выхода.

#!/bin/bash

update()
{
    trap "move_left;" $LEFT
    trap "move_right;" $RIGHT

    while true; do
         #output whatever needed
    done
}

read_in()
{
    trap "return;" SIGINT SIGQUIT

    while true; do
        read -s -n 1 key
        case key in
            C) kill -$RIGHT $game_pid ;;
            D) kill -$LEFT $game_pid ;;
        esac
    done
}

move_left()
{
    #update position variable
}

move_right()
{
    #update position variable
}

update &
game_pid=$!
read_in

kill -9 $game_pid

Используйте пример сценария, связанного выше для версии рабочего примера, но там у вас есть! Просто сделали немного переработки архитектуры программы.

1
27.01.2020, 21:23

Вам нужна многопоточная. Посмотрите на GNU Parallel

2
27.01.2020, 21:23

Теги

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