Я часто пишу вики-инструкции по установке различных серверных пакетов на Ubuntu (на данный момент 11.10 Oneiric). Они всегда включают такие вещи, как:
sudo apt-get install -y postfix
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
но когда вы вырезаете и вставляете это в терминал, sudo, apt-get или какая-то подоболочка случайным образом проглатывает последующие строки ввода, и только apt-get install
бывает.
Есть ли способ сделать это более удобным для вырезания и вставки? Полагаю, я мог бы обернуть каждый раздел
cat > script <<EOF
apt-get install -y postfix
cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
EOF
sudo sh ./script
но есть ли способ лучше?
По этому поводу есть выдающийся отчет об ошибке: Отчет об ошибке Debian № 728775 - apt-get неоправданно потребляет ввод. В отчете говорится:
Когда apt-get вызывается способом, который включает фактическую установку пакета, он считывает любые доступные данные со стандартного ввода, независимо от фактической необходимости. Это нарушает обычную возможность интерактивной оболочки набирать следующую команду во время выполнения текущей: apt-get потребляет ввод, который был предназначен для оболочки. strace показывает, что входные данные считываются процессом apt-get верхнего уровня с помощью read (2) из fd 0 в ответ на pselect (2).
...
Он находится в pkgDPkgPM :: Go () в apt-pkg / deb / dpkgpm.cc. Далее по той же функции есть цикл pselect, который соответствует тому, что я видел с помощью strace. Он читает из stdin условно только после (master> = 0 &&! D-> stdin_is_dev_null)
И в ответ:
Это делается для того, чтобы кто-то не набирал следующую команду во время загрузки пакетов, но затем этот ввод использовался в качестве ответа на приглашение во время установки.
Обходной путь для вас, поскольку вы уже даете apt-get
в -y
вариант, поэтому, предположительно, не хочу, чтобы он задавал вопросы или читал ответы, - это перенаправить stdin на / dev / null. Когда я делаю следующее:
apt-get install -y gdb-doc < /dev/null
мой типаж во время выполнения apt-get
команда не сбрасывается.
Способ избежать проблемы с вырезанием и вставкой, а также безопасно запускать команды подряд - это поместить их в одну строку, разделенную символом &&
который будет выполнять только cp
об успешном завершении sudo apt-get install
:
sudo apt-get install -y postfix && sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
В конце концов, если первая команда не удалась, вы, вероятно, не захотите продолжать выполнение остальных команд.
Что касается того, почему команды проглатываются, когда вы вставляете сразу несколько строк ... когда postfix устанавливается, он задает вопросы конфигурации с интерфейсом диалога debconf, который, вероятно, мешает вырезанию и вставке. Может, другой интерфейс вроде readline или неинтерактивный помешал бы меньше? Тем не менее, я бы использовал &&
в любом случае, так как он безопаснее.
Если вы устанавливаете postfix со своими скриптами, похоже, вы пытаетесь автоматизировать установку новых систем? Если да, рассмотрите возможность использования предпосев как вариант (вот несколько Специальная документация Ubuntu 11.10) или, может быть, использовать кукольный?
Для apt-get я нахожу, что yes
работает лучше чем -y
:
yes | apt-get install postfix
Я не уверен, почему это происходит с вашей пастой. Со мной такого не бывает.
Возможно, решение скорее социальное, чем техническое.
Напишите свои команды в отдельной строке, разделив их документацией:
Сначала устанавливаем постфикс:
sudo apt-get install -y postfix
Затем мы получаем его конфигурацию:
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
Если людей заставляют вырезать и вставлять строку за строкой, проблема «последующей строки» исчезает. И больше документации никогда не помешает. :)
Если ваша проблема связана с apt-get install
команду, вы можете попробовать следующее:
sudo apt-get install -y -q=2 postfix
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
sudo apt-get install -y postfix 2>&1 |tee
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix 2>&1 |tee