重复使用apt update和apt upgrade命令中的apt up部分以仅在一行中依次执行


11

如何重用and 命令的apt up一部分以在没有别名的情况下仅一行执行两个命令。apt updateapt upgrade

类似于:apt up{date,grade}


实现这一目标的实际目的是什么?为什么这可能很有趣/有意义?

25
@vanadium我们是Linux用户,尝试毫无意义的事情可以使我们学习以后可以应用到更复杂的事情上的技术,如果我们没有做到这一点,说实话,我们谁也不会在这里
Darren H

1
@DarrenH那就是我的想法:-)

Answers:


19

简单的方法(更有效)是通过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。但是eval通常不建议在Shell脚本中使用,并且此命令比for循环更复杂且不可移植。变化对无EVAL主题(和最短的,到目前为止,但效率不高,由于管和大量的命令echo,二aptsudosh所以很多分叉的):

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

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

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

或者也可以再次使用for循环,因为如果您未在其中指定序列,则默认情况下会处理位置参数 for variable (sequence)

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

set在很多使用shell的专业人士中,我看到使用是一种非常普遍的技术,这是有充分的理由的-这种方法非常便携,可以在/bin/sh没有阵列或{a,b,c}扩展的情况下使用。因此POSIX的可移植方式是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实际执行命令的情况下运行它


7
只需在一行中执行for循环即可。for i in {date,grade}; do sudo apt up${i}; done
Videonauth

3
如果您希望保持文件整洁,也可以在中添加别名~/.bash_aliases。此文件应由自动提供~/.bashrc
francescop21 '18

2
我已经用您想要的内容更新了答案。它是单线的,但我不认为它是否使它更容易。坦白说,当您要运行apt带有不同参数(更新和升级)的两个命令(是的,这是两个命令)时,这样做毫无意义,所以我仍然要说for循环是
可行

1
无需在循环头中进行字符串扩展,只需将迭代命名为:for i in date grade; do
rexkogitans

5
这样的别名显然应该命名upgrate
管道

14

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

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

6
您甚至可以使用!#:s/dat/grad来保存另外2个字符
Dan

9

使用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别名因为这些“简单”的方法还不够简单到无法实际使用。


1
非常好。printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%尽管可能更长一些,但主题可能有所不同
Sergiy Kolodyazhnyy

printf '%s'通常是个好习惯,因为您无法逃脱它,例如使用--help-e
yyny

@YoYoYonnY是的。也许printf '%s\0'会更好,它xargs有一个标记来处理终止为null的args
Sergiy Kolodyazhnyy 18-10-22

2

创建一个这样的函数:

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

然后就可以运行了repeat 'apt up' {date,grade}。这样做的好处是可用于完全不同的命令,尽管它不会节省您为此键入的任何内容。

我当然会同意其他一些答案,因为这样可能更有用:

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

0

@muru的答案导致我阅读了历史扩展,发现了另一个变体

 $ sudo apt update
 $ ^dat^grad^

^string1^string2^等价于!!:s/string1/string2/,它接受最后一个命令并替换string1string2


-2

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

Up ArrowBackspaceBackspaceBackspaceBackspace

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.