我经常写 wiki 说明来在 Ubuntu(目前为 11.10 Oneiric)上安装各种服务器软件包。它们总是涉及以下内容:
sudo apt-get install -y postfix
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
但是当您将其剪切并粘贴到终端时,sudo、apt-get 或某些子shell 会随机吞噬后续的输入行,并且只会apt-get install
发生这种情况。
有没有办法让这个更适合剪切粘贴?我想我可以用
cat > script <<EOF
apt-get install -y postfix
cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
EOF
sudo sh ./script
但还有更好的方法吗?
答案1
避免剪切粘贴问题以及连续安全地运行命令的一种方法是将它们放在同一行上,用 分隔,只有在成功完成后&&
才会执行: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 特定文档)或者使用木偶?
答案2
关于此问题有一个未解决的错误报告:Debian Bug 报告 #728775 - apt-get 不必要地消耗输入.报告称:
当以实际安装软件包的方式调用 apt-get 时,它会从标准输入读取任何可用数据,而不管实际需要如何。这破坏了在交互式 shell 中在当前命令运行时键入下一个命令的通常能力:apt-get 会消耗原本用于 shell 的输入。strace 显示输入是由顶级 apt-get 进程通过 read(2) 从 fd 0 读取的,以响应 pselect(2)。...
它
位于 apt-pkg/deb/dpkgpm.cc 中的 pkgDPkgPM::Go() 中。在同一个函数的下方,有一个 pselect 循环,它与我在 strace 中看到的一致。它仅在 (master >= 0 && !d->stdin_is_dev_null) 的条件下从 stdin 读取
并在回复中说道:
这是为了避免有人在软件包下载时输入下一个命令,但随后该输入被用作安装过程中提示的答案。
由于您已经提供了选项,所以大概不希望它询问问题或读取响应,因此可以采用一种解决方法,apt-get
即将-y
stdin 重定向到 /dev/null。当我执行以下操作时:
apt-get install -y gdb-doc < /dev/null
执行apt-get
命令期间我的输入未被刷新。
答案3
对于 apt-get 我发现它yes
比以下方法效果更好-y
:
yes | apt-get install postfix
答案4
我不确定为什么你的粘贴会出现这种情况。我没有遇到这种情况。
也许解决方案是社会性的,而非技术的。
将您的命令写在一行上,并用文档将它们分隔开:
首先,我们安装 postfix:
sudo apt-get install -y postfix
然后,我们获取其配置:
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
如果人们被迫逐行剪切粘贴,“后续行”问题就消失了。而且更多的文档永远不是坏事。:)