![粘贴多行以便它们一致执行](https://linux22.com/image/150738/%E7%B2%98%E8%B4%B4%E5%A4%9A%E8%A1%8C%E4%BB%A5%E4%BE%BF%E5%AE%83%E4%BB%AC%E4%B8%80%E8%87%B4%E6%89%A7%E8%A1%8C.png)
这是一个非常简单的代码片段的示例,我想以执行所有内容的方式将其粘贴到我的终端。
sudo apt update
sudo apt upgrade
sudo apt -y install build-essential
sudo apt -y install git
sudo apt -y install libxml2-dev # required for some tools using xml files
sudo apt autoremove
不幸的是,如果没有事先安装 build-essential ,会发生什么,它只会运行到sudo apt -y install build-essential
.后续行将被跳过。如果未安装 git,情况也是如此:它将运行到 git 行,然后跳过其余部分。
发生这种情况的原因是什么?有没有办法解决这个问题,而无需创建脚本文件并通过 bash 运行它?
答案1
假设您仍在 sudo 的凭据缓存超时范围内(如果您不确定,只需在sudo -v
运行代码片段之前刷新它),就会发生该问题,因为 apt(-get) 是一个非常丰富的控制台应用程序,因此即使它不询问您任何内容也会消耗标准输入因为-y
.
您可以通过在子 shell 中运行整个代码片段来解决这个问题:
在提示符下,首先输入 a(
然后粘贴代码片段,然后输入结束语)
并按回车键
应该走了。
请注意,粘贴代码片段后并未立即执行。它而是在命令行上“排队”,等待右括号。
(PS:根据您的系统,您可能需要使用apt-get autoremove
代替apt autoremove
,并且您可能还需要使用-y
onupdate
和upgrade
)
答案2
sudo apt upgrade
如果命令与命令之间有足够的时间sudo apt install -y build-essentials
,那么 SUDO 将再次提示您输入密码。
由于您要将文本粘贴到控制台中,因此下一行将作为 STDIN 接受到 SUDO 提示输入密码。如果该行与您的密码不匹配,身份验证将失败并且该build-essentials
行将不会被执行。