在Ubuntu中,有一个单一的命令可以更新所有内容吗?

我知道有三个命令可以更新和升级整个系统,它们是:

是否有一个超级升级命令,将所有这些命令合并为一个


2不,你最多可以执行sudo apt-get update && sudo apt-get dist-upgrade - heemayl
1还是一个命令行!**;-)** - Fabby
对于那些将来可能遇到这个问题的人,这里有一个相关的问题,可以将“update”和“upgrade”作为一行命令运行。https://askubuntu.com/a/1086022/295286 - Sergiy Kolodyazhnyy
我有一个文件夹,里面包含了我运行的所有自定义命令/NSCS/bin。 - Nate
9个回答

有三个不错的选择:
你可以创建一个类似下面的脚本:
#!/bin/bash set -e sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade 将其命名为update.sh,并放置在/usr/local/bin目录下,然后通过运行以下命令使脚本可执行:
sudo chmod +x /usr/local/bin/update.sh
另一种方法是创建一个bash别名(在~/.bashrc中)或者你通常存储别名的地方:
alias update='sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade'
最后一种方法是在命令行上直接将这三个命令串联起来执行:
sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade

几个选择...

参考:


11当你使用dist-upgrade时,先进行upgrade是没有意义的。 - heemayl
5@heemayl:理论上是可以的。但在实践中,有一些特殊情况下,直接使用dist-upgrade可能会失败,而先使用upgrade再使用dist-upgrade则不会出现这种问题。这主要是由于软件包依赖定义错误或混合使用来自不同版本/发行版/PPA的软件包所导致的。如果只使用来自Canonical官方软件仓库的软件包,并且只针对一个版本(默认版本),这种错误应该非常罕见,并且会很快得到修复。 - David Foerster
4还有第三种 给朋友留下印象 的变体:for x in update {,dist-}upgrade; do sudo apt $x; done - Eli Barzilay
4在第一步中,"set -e" 是什么作用? - karjedavpalaa
3@karjedavpalaa - "-e 如果一个命令以非零状态退出,则立即退出。" - Josh

我们可以用一条命令解决(不需要脚本,只需复制粘贴)。
sudo apt update -y && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo apt clean -y && sudo apt autoclean -y
  • update - 更新软件包列表但不安装
  • upgrade - 如果有新版本可用,则安装软件包的新版本
  • full-upgrade - 执行升级功能,但如果需要升级整个系统(修复错误依赖关系),则会删除当前安装的软件包
  • autoremoveautocleanclean - 清理不再需要的旧软件包
  • 选项-y在每个步骤上不会请求权限
  • &&表示只有在前一个命令成功执行后才运行下一个命令

别名

您还可以创建别名。将以下行添加到您的~/.bashrc~/.bash_aliases文件中(如果有)

alias upev='sudo apt update -y && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo apt clean -y && sudo apt autoclean -y'

运行source ~/.bashrcsource ~/.bash_aliases来获取您的新别名,然后只需运行即可。
upev 

注意:我选择使用“upev”来表示UPgrade EVerything,但你可以选择任何你想要的东西。

如果你在apt upgrade后加上--auto-remove,就可以跳过apt autoremove - Cameron Tacklind
对我来说,最好将自动删除设置为一个独立的步骤,以便再次确认是否会删除我使用的内容。 - emk2203
@emk2203 除非你添加“-y”,否则它会要求你确认删除操作。 - Cameron Tacklind
好知道了,我应该在评论之前试一试。谢谢。 - emk2203

如果你对于输入太多感到烦恼,你可以给自己定义一个“别名”。例如,你可以在你的$HOME/.profile文件的末尾添加一行代码来实现这个功能。
alias sau='sudo aptitude update && sudo aptitude upgrade'

当然,你可以用其他东西替换“sau”——对我来说,这是Sudo Apt-get Update的首字母缩写。保存文件后,打开一个新的shell(或者再次运行. $HOME/.profile来“source” .profile)。现在你只需输入“sau”就能完成整个工作。对我来说,在多台机器上都非常好用。

嗯,我猜我只是在请求别人告诉我给它起个别名:P - polandeer
是的,但这是使用“单个命令”完成的唯一方式。而且你的问题并没有排除这种可能性 ;) - Izzy
有点棘手。不管怎样,我问的唯一原因是因为我想更好地理解apt,而不是因为我懒得写sudo aptitude update && sudo aptitude upgrade。我问的原因是因为你可以用pacman来做(sudo pacman -Syu --noconfirm)。 - polandeer
如果你经常需要这样做,并且在多台机器上进行操作,你会很高兴至少可以使用别名。然而:根据man页面显示可用的更新,apt-get update有一个参数-u。我没有尝试过是否会要求应用这些更新(现在身边没有Ubuntu/Debian来检查)。 - Izzy

sudo apt install unattended-upgrades

这是迄今为止最好的一行。所有其他解决方案都需要每天重复输入相同的一行。这真正是一个一键解决方案。请参阅来自Ubuntu的官方apt文档!

通过编辑位于/etc目录下的此软件包的.conf文件,您可以设置update、install、clean、autoremove的频率...

或者只需发送电子邮件,其中包含可用更新的通知和软件包名称列表。

每次更改都会生成一个不错的小日志文件,我想还可以编写一个小脚本作为GUI扩展,在桌面通知中弹出(与主题无关)。


很遗憾,这两个命令必须分别执行。

有没有一个超级升级命令,将所有这些命令合并为一个?
嗯...坏消息是没有。不过好消息是我已经把它们整合到了一起。
为了进一步简化,我将其创建成了一个“单一”的命令行。所以,这就是它:
echo "sudo apt update && sudo apt -y upgrade && sudo apt -y dist-upgrade && sudo apt -y autoremove && sudo apt autoclean" > update && sudo mv update /usr/local/bin/update && sudo chmod +x /usr/local/bin/update

现在,每当需要更新时,您只需在终端中键入update,输入密码,然后就完成了。
这可能看起来像是那种你只能复制粘贴的难以理解的东西。但实际上它并不需要那么复杂!事实上,它非常简单,所以……

这是什么:

  1. 每个更新命令(以及后续的命令)都使用&&连接在一起(包括apt autoremove以删除不再使用的依赖项)。
  2. 对于每个会提示用户进行肯定回答以执行操作的apt命令,添加了-y选项。
  3. 在命令之前添加了echo,并且该行用""括起来,以避免字符转义。
  4. 使用>echo的输出(即我们的行)重定向/写入到一个名为“update”的文件中。
  5. 将该文件移动到/usr/local/bin/,以便可以从任何位置执行它。写入此路径需要超级用户访问权限,这就是为什么在之前的步骤中无法完成的原因。
  6. 使用chmod将该文件设置为可执行文件。

只需复制粘贴以下alias命令并执行即可:
alias fup='sudo apt-get -y update;sudo apt-get -y full-upgrade;sudo apt-get -y autoremove; sudo apt-get -y autoclean'

现在,运行fup将自动执行在alias中定义的所有任务。
如果您需要经常使用此功能,请按照以下步骤操作。
  1. 在您的$HOME目录下创建一个名为.bash_aliases的文件。您可以使用以下命令在终端中执行此操作:

    touch ./.bash_aliases
    
  2. .bash_aliases文件中粘贴上述提到的alias命令。

  3. 现在保存文件并退出。

  4. 编辑您的.bashrc文件以导出您的.bash_aliases文件。因此运行:

    gedit .bashrc
    

    并将以下代码粘贴到文件末尾:

    if [ -f /home/abhyam/.bash_aliases ];then
    source /home/abhyam/.bash_aliases
    fi
    
  5. 保存文件并退出。

  6. 运行:

    source .bashrc
    
  7. 现在您可以随时运行fup命令来完全更新和升级您的系统。

创建.bash_aliases文件的好处是,您还可以在该文件中为其他操作创建自定义别名,并且每次打开终端时它都会自动被加载。

我在寻找同样的宝藏时找到了这个帖子。如果有人仍然感兴趣,我一直在进行一个git项目,其中运行相同的命令。

#!/usr/bin/bash
    RED='\033[0;31m'
    GREEN='\033[0;32m'
    PURPLE='\033[0;35m'
    NC='\033[0m' # No Color

#Region --- Updates
    echo -e "${PURPLE}RUNNING: sudo apt update --fix-missing${NC}"

for i in {1..100}
do  
    sudo apt clean
    sudo apt update --fix-missing
    status=$?
if test $status -eq 0
then 
    echo -e "${GREEN}SUCCESS: sudo apt update --fix-missing${NC}\n"
    break
else 
    echo -e "${RED}FAILED: sudo apt update --fix-missing${NC}\n"
    sleep 1m
fi
done

#Region --- Upgrades
for i in {1..100}
do  
echo -e "${PURPLE}RUNNING: sudo apt upgrade -y${NC}"
    sudo apt full-upgrade -y
    status=$?
if test $status -eq 0
then
    echo -e "${GREEN}SUCCESS: sudo apt upgrade -y${NC}\n"
    break
else 
    echo -e "${RED}FAILED: sudo apt upgrade -y${NC}\n"
    sleep 1m
fi
done

#Region
for i in {1..100}
do  
echo -e "${PURPLE}RUNNING: sudo apt autoremove -y${NC}"
    sudo apt autoremove -y
    status=$?
if test $status -eq 0
then 
    echo -e "${GREEN}SUCCESS: sudo apt autoremove -y${NC}\n"
    break
else
    echo -e "${RED}FAILED: sudo apt autoremove -y${NC}\n"
    sleep 1m
fi
done

#Region --- Exiting BasherUpdate
    echo -e "${PURPLE}Exiting BasherUpdate...${NC}\n"
    exit 0

请注意,我在apt update命令上使用了一个循环,因为我遇到了mirror sync in progress错误,并希望它继续尝试。希望这能有所帮助,如果你有建议,请告诉我!

在其他地方找到了这个:
    sudo -- sh -c "apt update && apt upgrade -y"

你也可以在你的 ~/.bash_aliases 中使用别名 'upgrade' 来代替这个命令,例如:
    alias upgrade="sudo -- sh -c 'apt update && apt upgrade -y'"

执行 'source ~/.bash_aliases' 使其生效。