e20*_*200 11 upgrade updates command-line apt bash
如何重用和命令的apt up一部分,在没有别名的情况下在一行中按顺序执行两个命令。apt updateapt upgrade
类似的东西:apt up{date,grade}。
Ser*_*nyy 19
简单的方法(更有效)是通过 for 循环(在一行上,但为了清楚起见,这里显示为多行):
for i in {date,grade}; do
apt up${i}
done
Run Code Online (Sandbox Code Playgroud)
聪明的方法是~/.bashrc为这两个命令创建一个别名并忘记再次重新键入它:
alias upgrade=' sudo apt update && sudo apt upgrade'
Run Code Online (Sandbox Code Playgroud)
详细的方法是这样做:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
Run Code Online (Sandbox Code Playgroud)
看看发生了什么?我们正在构建一个由 shell 运行的有效文本字符串。现在您需要做的就是使用eval而不是echo. 但eval通常不推荐在 shell 脚本中使用,并且此命令比 for 循环更复杂且不可移植。没有 eval 的主题变化(并且是迄今为止最短的,但由于管道和多个命令echo,两个apt,sudo以及sh很多分叉而效率不高):
$ echo "apt "{update,upgrade}";"|sudo sh
Run Code Online (Sandbox Code Playgroud)
我们还可以使用set将所需的序列转换为位置参数,然后apt使用$1和$2args执行:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
Run Code Online (Sandbox Code Playgroud)
或者再次使用 for 循环,因为如果您没有在 for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
Run Code Online (Sandbox Code Playgroud)
使用set是我在经常使用 shell 的专业人士中看到的一种非常常见的技术,并且有充分的理由 - 这是非常便携的,并且可以在/bin/sh没有数组或{a,b,c}扩展的情况下工作。所以 POSIX-ly 可移植的方式将是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
Run Code Online (Sandbox Code Playgroud)
当然记得在没有echo实际命令执行的情况下运行它
mur*_*uru 14
您还可以使用 bash历史扩展来获取当前命令行的部分内容并对其进行修改:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
Run Code Online (Sandbox Code Playgroud)
!# 是当前行:s/date/grade是一个修饰符,替换date为grade使用xargs代替的另一个简单选项for:
echo up{dat,grad}e | xargs -n1 apt
Run Code Online (Sandbox Code Playgroud)
测试:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
Run Code Online (Sandbox Code Playgroud)
然而,我更喜欢像 Sergiy 一样的 shell 别名,因为这些“简单”的方法不够简单,不足以真正有用。
| 归档时间: |
|
| 查看次数: |
4197 次 |
| 最近记录: |