重用`apt update`和`apt upgrade`命令的`apt up`部分,只需一行就能按顺序执行

如何重用apt updateapt upgrade命令的apt up部分,只需一行就可以执行这两个命令而不需要别名。

类似于: apt up{date,grade}

简单的方法(也更有效)是via for循环(在一条线上,但为了清楚起见,它在多行中显示):

 for i in {date,grade}; do apt up${i} done 

聪明的方法是在~/.bashrc为这两个命令创建一个别名,而忘记重新输入它:

 alias upgrade=' sudo apt update && sudo apt upgrade' 

精心设计的方法是这样做:

 $ echo sudo" "apt" "up{"date","grade"}" && " : sudo apt update && sudo apt upgrade && : 

看看发生了什么? 我们正在构建一个由shell运行的有效文本字符串。 现在你需要做的就是使用eval而不是echo 。 但是在shell脚本中通常不建议使用eval ,并且此命令比for循环更复杂且不可移植。 没有eval的主题变化(到目前为止最短,但由于管道和多个命令echo而效率不高,两个aptsudosh很多分叉):

 $ echo "apt "{update,upgrade}";"|sudo sh 

我们也可以使用set将所需的序列转换为位置参数,并使用$1$2 args执行apt

 $ set {update,upgrade}; echo apt $1 && echo apt $2 apt update apt upgrade 

或者再次使用for循环,因为如果没有在for variable (sequence)指定序列for variable (sequence) ,它默认处理位置参数

 $ set {update,upgrade} ; for i; do echo apt $i ;done apt update apt upgrade 

使用set是一种非常常见的技术,我在使用shell的专业人员中看到了很多,并且有充分的理由 – 这是非常便携的,可以在没有数组或{a,b,c}扩展的/bin/sh中工作。 所以POSIX-ly便携式方式将set update upgrade ; for i; do echo apt $i ;done set update upgrade ; for i; do echo apt $i ;done set update upgrade ; for i; do echo apt $i ;done 。 此外,这应该是有效的。


或者我们可以去while循环路线:

 $ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done apt update apt upgrade 

当然记得在没有echo的情况下运行它来执行实际的命令执行

您还可以使用bash 历史记录扩展来获取当前命令行的一部分并进行修改:

 $ apt update; !#:s/date/grade apt update; apt upgrade; Reading package lists... Done ... 
  • !#是当前行
  • :s/date/grade是一个修饰符,用date替换date

使用xargs而不是for另一个简单选项:

 echo up{dat,grad}e | xargs -n1 apt 

测试:

 $ echo up{dat,grad}e | xargs -n1 echo apt apt update apt upgrade 

但是,我更喜欢像Sergiy这样的shell别名,因为这些“简单”的方法并不简单,实际上并不实用。

创建一个这样的函数:

 repeat() { for suffix in "${@:2}"; do eval "$1""$suffix"; done } 

然后你可以repeat 'apt up' {date,grade} 。 这有利于可以重复使用完全不同的命令,虽然它不会为你节省任何打字。

我当然同意其他一些答案,这样的事情可能更有用:

 alias apt-up='apt update && apt upgrade' 

在〜/ .bashrc中添加以下内容

 alias doit='echo; kill $( ps -eafww|grep update-manager|grep -v grep | grep update-manager | tr -s " " |cut -d" " -f2 ) > /dev/null 2>&1; echo "sudo apt-get update && sudo apt-get dist-upgrade && [ -f /var/run/reboot-required ] && echo && echo reboot required && echo";echo;sudo apt-get update && sudo apt-get dist-upgrade && [ -f /var/run/reboot-required ] && echo && echo reboot required && echo ' 

然后执行更新,然后进行升级,然后根据需要使用打印件告诉您机器想要重新启动问题

 doit 

对于还包括一些包清理的东西使用这一个

 alias doit='echo; kill $( ps -eafww|grep update-manager|grep -v grep | grep update-manager | tr -s " " |cut -d" " -f2 ) > /dev/null 2>&1; sudo apt-get update && echo "sudo apt-get -f install -y " && sudo apt-get -f install -y && echo "sudo apt-get -o Dpkg::Options::="--force-confnew" -yy dist-upgrade -yq" && sudo apt-get -o Dpkg::Options::="--force-confnew" -yy dist-upgrade -yq && echo " df -h" && df -h && echo "sudo apt-get autoremove -yq " && sudo apt-get autoremove -yq && echo "sudo apt-get autoclean -y" && sudo apt-get autoclean -y && echo ' 

我使用以下键序列重新使用命令的apt-get up部分:

向上箭头 退 退 退 退