Почему я не могу использовать bash свободно после использования “ At ” утилита? (Невозможно вставить stdin до ctrl + c)

Я запустил следующий блок кода (время ожидания at для удаления PHPmyadmin). Должно быть запланировано запустить 2 шага вперед, но я запустил его в течение 2 минут, просто чтобы проверить его:

bash /dev/fd/50 50<< PMA_UNINSTALL | at 'now + 2 minutes'

apt-get purge phpmyadmin -y
PMA_UNINSTALL

Утилита at, похоже, не позволяет мне использовать Bash свободно, если я не делаю CTRL + C. At также запрашивает следующее предупреждение, которое является нормальным и жестко закодировано в исходном коде Utility. Когда я делаю CTRL + C, предупреждение исчезает, и я снова могу использовать Баша. Команды

будут выполняться с использованием / bin / sh

Я не говорю, что это предупреждение, которое мешает мне регулярно использовать Bash, как только он появится. Я знаю, что предупреждение - это просто stdout, и что-то еще может помешать мне создать stdin.

Что мешает мне создать stdin, который связывает вышеуказанный блок кода с at, и как я могу достичь состояния, когда я мог бы выполнять команды, подключенные по каналу, но свободно использовать Bash прямо после этого, не прерывая at до работа?

1
задан 14 February 2017 в 15:24

1 ответ

TL; DR: эти команды, похоже, не делают то, что вы, вероятно, намереваетесь.

Если вы пытаетесь сделать at выполнить apt-get purge phpmyadmin -y с bash за 2 минуты, тогда ваш код не будет делать то, что вы хотите.

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

From 3.6.6 Здесь Документы в Справочном руководстве Bash:

Этот тип перенаправления инструктирует оболочку прочитайте ввод от текущего источника до тех пор, пока не появится строка, содержащая только слово (без конечных пробелов). Все строки, считываемые до этой точки, затем используются в качестве стандартного ввода (или дескриптора файла n, если n задано) для команды.

Команда с документом здесь - это, по сути, только одна команда, которая должна быть полностью прочитана оболочкой перед ее выполнением. В вашем коде оболочка считывает ввод до тех пор, пока PMA_UNINSTALL не появится на отдельной строке. Как только это произошло, оболочка затем использует содержимое документа здесь как дескриптор файла 50 для команды bash /dev/fd/50.

Эта команда даже не запускает новый экземпляр bash до тех пор, пока здесь документ был полностью прочитан. Когда bash запускается, он выполняет эту команду:

apt-get purge phpmyadmin -y

Поскольку вся левая сторона канала TL; DR: эти команды, похоже, не делают то, что вы, вероятно, собираетесь использовать. имеет стандартный выход, подключенный к at, вход at получает выход bash, который является выходом apt-get purge phpmyadmin -y. at затем пытается интерпретировать этот вывод, а не вашу команду apt-get, но его вывод - как список команд для выполнения в /bin/sh.

Так что это почти наверняка не то, что вы

Я не уверен, почему вы не получили приглашение оболочки сразу после ввода этого кода. Когда я запускаю его на тестовой машине, я получаю приглашение оболочки через пару секунд. Если вы хотите отладить это, вы можете попробовать запустить apt-get purge phpmyadmin -y интерактивно в bash. Как написан ваш код, эта команда полностью запускается output at возвращается в оболочку (а до at может планировать что угодно). Однако, вероятно, было бы нецелесообразно отлаживать этот конкретный код.

4
ответ дан 23 May 2018 в 02:50
  • 1
    Вы должны взглянуть на историю вопроса OP здесь и U & amp; L, чтобы понять, что они пытаются сделать. Я лично думаю, что они зафиксированы на конкретном решении и ничего не сделают, но кто знает? – muru 4 January 2017 в 02:18
  • 2
    На самом деле я не знал, что в то время еще что-то называлось tmux. Я хочу использовать tmux, но для этого нужно следующее решение tmux: unix.stackexchange.com/questions/335087/… – JohnDoea 7 January 2017 в 08:12

Другие вопросы по тегам:

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