如何防止脚本在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 sudo su apt-get -y install gcc g++ make cmake perl cd ~/ mkdir t1 cd t1
这可能是个问题吗? 或者为什么我的脚本在apt-get
完成后停止,以及如何让它继续?
首先,你没有运行脚本。 粘贴一系列命令不会产生脚本。 正如Jobin的回答所述,如果您实际使用的是脚本,则不会出现此问题。
问题可能是您使用命令重载输入缓冲区,并希望bash是从输入缓冲区读取的下一个进程。 apt-get有很多原因可以从输入缓冲区中读取,因此当它完成并且让你回到bash时就不会留下任何东西。
如果需要,您仍然可以粘贴一系列命令,而无需复制或编写脚本文件并使其可执行。 (在许多情况下,创建脚本会浪费精力,例如,您必须在多台计算机上执行一组简单的命令,而不是在同一台计算机上执行两次。)
如果粘贴由分号分隔的一系列命令,则整个序列将被送入bash,并且无论apt对输入缓冲区执行什么操作都将继续:
apt-get -y install gcc g++ make cmake perl; cd ~/; mkdir t1; cd t1
我有同样的问题,但对这里的解决方案不太满意,或者解决方案对我不起作用。 我发现让它运行的是向apt-get发送一个NULL输入,以便它继续工作。
它看起来像这样:
apt-get -y install gcc g++ make cmake perl < "/dev/null" cd ~/ mkdir t1 cd t1 #newline
希望其他人也可以使用它! 不要忘记换行符,以便执行最后一个命令
您不应该在终端上的脚本中复制粘贴命令,脚本应该在终端上执行。 第一种方法的问题是,只要第一个命令与其末尾的新行一起粘贴,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
(用你给脚本的名称替换filename)。 此脚本的第一行告诉您在直接运行脚本时使用哪个shell(首先使用chmod +x filename
使其可执行),然后将脚本作为/path/filename
。
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
会以非零代码退出 - 所以外部脚本会退出级联 - 但它没有,并继续执行。
- 更新apt repos时Ubuntu 64位“无法获取文件 binary-i386 / Packages”错误
- 由于GPG错误无法更新我的系统Clearsigned文件无效,得到’NODATA’
- 将Python安装还原为默认加上apt包依赖项
- 我无法在我的64位Ubuntu上安装libtiff
- Ubuntu 16.04 LTS无法获取/散列和不匹配
- Troublesome Paraview安装,12.04 LTS(而不是14.04 LTS)
- 无法在实时系统上找到包python-pip
- Apt-get问题和错误:VIM
- 运行“apt-get remove dependencies-names”后,“dpkg -l”中仍然存在依赖关系