如何防止脚本在 apt-get 之后不停止?

如何防止脚本在 apt-get 之后不停止?

我保留了一些 bash 代码片段,并在需要管理时复制粘贴它们。但我发现apt-get取消了脚本执行。这是我的脚本有问题的地方。

apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

我将 OS X 终端上的该脚本复制并粘贴到 Ubuntu 12.04 LTS 服务器(在 VM 上全新安装)apt-get完成后脚本总是停止。

我使用这样的帐户运行此命令root

ssh user1@server

<password…>

sudo su

<password…>

apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

这会是个问题吗?或者为什么我的脚本apt-get完成后会停止,如何让它继续?

答案1

我遇到了同样的问题,但对这里的解决方案不太满意,或者这些解决方案对我来说不起作用。我发现让它运行的方法是向 apt-get 发送一个 NULL 输入,这样它就可以继续工作。

它看起来像这样:

apt-get -y install gcc g++ make cmake perl  < "/dev/null"

cd ~/
mkdir t1
cd t1

#newline

希望其他人也能用这个!不要忘记换行符,这样最后一个命令也会被执行

答案2

首先,您没有运行脚本。粘贴一系列命令不会生成脚本。正如 Jobin 的回答中所述,如果您实际使用脚本,则不会遇到此问题。

问题可能是你用命令超载了输入缓冲区,并希望 bash 是下一个从输入缓冲区读取的进程。有很多原因导致 apt-get 会从输入缓冲区读取,因此当它完成并让你返回 bash 时,什么都没有留下。

如果您愿意,您仍然可以粘贴一系列命令,而不必费力复制或编写脚本文件并使其可执行。(在许多情况下,创建脚本会浪费精力,例如,一组简单的命令,您必须在多台计算机上执行,但绝不会在同一台计算机上执行两次。)

如果您粘贴用分号分隔的一系列命令,则整个序列将被输入到 bash 并且无论 apt 对输入缓冲区执行什么操作都会继续:

apt-get -y install gcc g++ make cmake perl; cd ~/; mkdir t1; cd t1

答案3

您不应该将脚本中的命令复制粘贴到终端上,脚本应该在终端上执行。第一种方法的问题是,一旦第一个命令连同其末尾的新行一起粘贴,apt-get 就会开始执行,这会阻止将其他命令粘贴到终端上,因此它们将无法执行。

要执行脚本,请将命令写入文件run.sh(或您想要的任何名称),如下所示:

#!/bin/bash
apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

然后要在终端上执行它,请键入bash run.shbash filename(将文件名替换为您为脚本指定的名称)。此脚本的第一行告诉您如果直接运行脚本(首先使用 使其可执行chmod +x filename),然后以 身份运行脚本,则应使用哪个 shell /path/filename

答案4

apt-get即使安装成功,有时也会以非零代码退出。

这会导致脚本停止运行。这简直是无稽之谈,而且很荒谬,但我必须解决这个问题。我尝试通过用子脚本包装 apt-get 块来强制它继续运行,这样退出代码就可以被忽略。

set -e

bash << +END
apt-get -y install gcc g++ make cmake perl
exit 0
+END
echo $?

cd ~/
mkdir t1
cd t1

实际上我预计内部bash会以非零代码退出 - 因此外部脚本会退出级联 - 但是它没有,执行继续。

相关内容