From 05f10294e64cf113020442ea1094e25d13ded2d9 Mon Sep 17 00:00:00 2001 From: Toby Oxborrow Date: Fri, 9 Oct 2015 21:32:47 +0800 Subject: [PATCH] Redirect "apt-get install -y" stdin to /dev/null According to debian bug 728775 [1] apt-get by design will consume stdin (even when not run interactively). When the run-aio-build.sh script is used as part of a curl-pipe-bash such as described in the quick start docs [2] apt-get will effectively halt execution of the script after installing git. The next time the script is run it will get past the step because git is now installed and apt-get no longer consumes stdin. In addition to run-aio-build.sh, bootstrap-aio.sh and bootstrap-ansible.sh call apt-get and so exhibit the same behaviour when called by run-aio-build.sh when used as part of a curl-pipe-bash. In addition to apt-get install -y, apt-get purge -y exhibits the same behaviour. The result for the end user is they must run the command multiple times to get it to work. Using the bash method to close stdin (0<&- [3]) causes apt-get to print out "E: Write error - write (14: Bad address)" and fail. The solution is to explicitly set stdin to nothing, such as "echo '' | apt-get ..." or "apt-get ... < /dev/null". The latter is chosen for its aesthetics. yum install -y does not exhibit this behaviour and so does not require its stdin redirected. [1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=728775 [2] http://docs.openstack.org/developer/openstack-ansible/developer-docs/quickstart-aio.html#running-an-aio-build-in-one-step [3] http://www.tldp.org/LDP/abs/html/io-redirection.html Change-Id: I57484590e257956e1d1bc8e10ce8a35207622672 Closes-Bug: 1504546 --- scripts/bootstrap-aio.sh | 8 ++++---- scripts/bootstrap-ansible.sh | 2 +- scripts/run-aio-build.sh | 5 ++++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/scripts/bootstrap-aio.sh b/scripts/bootstrap-aio.sh index ebee530b3b..88f2c1258c 100755 --- a/scripts/bootstrap-aio.sh +++ b/scripts/bootstrap-aio.sh @@ -76,7 +76,7 @@ if [ ! "$(grep -e '^nameserver 8.8.8.8' -e '^nameserver 8.8.4.4' /etc/resolv.con fi # Ensure that the https apt transport is available before doing anything else -apt-get update && apt-get install -y apt-transport-https +apt-get update && apt-get install -y apt-transport-https < /dev/null # Set the host repositories to only use the same ones, always, for the sake of consistency. cat > /etc/apt/sources.list <