1

所以我对 Bash 很不熟悉,并且在不断尝试和错误中学习。我想知道为什么以下不起作用:

repeat我在我的 bashrc 文件中定义了函数。

repeat () {
         history > /dev/null
         !-2
}

然后在同一个文件中调用它,如下所示:

alias .="repeat"

是的,我知道我在劫持点运算符,但我有自己的别名(特别是用于采购 ~/.bashrc)。这个想法是能够编写.并让它重复最后一个命令。如果我在交互式 shell 中手动键入命令,但在别名中不能像这样工作,则此方法有效。没关系,它不能重复多次,我只想在解决这个问题之前让它工作。当我输入时,.我得到以下输出:

bash: !-2: command not found

我认为history当以非交互方式调用并且在其历史记录中不包含任何命令时,它不会从我的历史记录文件中读取,但是不,这会输出我的历史记录:

repeat () {
        history
        !-2
}

但是,我得到相同的结果。该!命令似乎不起作用。

知道我做错了什么吗?

编辑:我现在按照我想要的方式工作(请告诉我是否有更优雅的解决方案)但我想摆脱要执行的命令,即我只想要命令本身的输出。我想我会尝试这样的事情:

 19 repeat () {
 20         for ((i = 0; i<${1}; i++ ))
 21         do
 22                 $(fc -s) | tail -n +2
 23         done
 24 }
 25
 26 alias .="repeat 1"
 27 alias 1.="repeat 1"
 28 alias 2.="repeat 2"
 29 alias 3.="repeat 3"
 30 alias 4.="repeat 4"
 31 alias 5.="repeat 5"
 32 alias 6.="repeat 6"
 33 alias 7.="repeat 7"
 34 alias 8.="repeat 8"
 35 alias 9.="repeat 9"
 36 alias 10.="repeat 10"

但不幸的是它不起作用,它给了我错误的输出,然后当我再次尝试时它进入了一个无限循环。我如何实现这一目标?

4

1 回答 1

1

您可以使用“用于列出或编辑和重新执行历史列表中的fc命令”的命令。Bash手册为此提供了一个示例。

与 this 一起使用的有用别名是r="fc -s",因此键入会r cc运行以开头的最后一个命令cc,键入会r重新执行最后一个命令。

于 2020-10-09T13:30:54.010 回答