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

Почему я не могу свободно использовать 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также выдает следующее предупреждение, что является нормальным и жестко закодировано в исходном коде утилиты. Когда я нажимаю CTRL+, Cпредупреждение исчезает, и я снова могу регулярно использовать Bash.

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

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

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

решение1

Мне потребовалось некоторое время, чтобы увидеть вашу реальную проблему — вы хотите напрямую отправить команду atвместо того, чтобы предоставить команду(ы) впоследствии, как я предполагал.

Нет необходимости в сложной схеме, просто введите

echo 'apt-get purge phpmyadmin -y' | at 'now + 2 minutes'

При таком подходе atне требуется никаких дополнительных действий, и вы сразу же возвращаетесь в командную строку.


(сохраню свой первоначальный ответ здесь)

Выдача atдает вам возможность перечислить команды для выполнения. Вы должны сказать, atчто вы закончили:

Нажмите CTRL+ D(Это также известно какКонец передачи)

решение2

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

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

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

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

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

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

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

apt-get purge phpmyadmin -y

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

Так что это почти наверняка не то, что вы собираетесь делать.

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

Связанный контент