我保留了一些 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.sh
或bash 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
会以非零代码退出 - 因此外部脚本会退出级联 - 但是它没有,执行继续。