0

当我编程时,我会发现自己循环使用相同的三个 shell 命令,例如:

  1. vim myGraphic.cpp
  2. g++ -lglut -lGLU myGraphic.cpp -o prettyPicture
  3. ./prettyPicture

为了避免每次都按三次向上键,我在我的 bashrc 中添加了以下内容:

function cyc { 
    CYCLE=3
    !-$CYCLE 
}

但是,当我使用“cyc”功能时,出现错误

“bash:!-3:找不到命令”。

这种历史扩展技术与 shell 交互地工作,但它似乎不适用于函数定义。这种差异的解释是什么?我怎样才能使一个等效于“cyc”的函数起作用?

4

3 回答 3

1

此处已提出此问题:使用“!” 在脚本中执行具有相同参数的命令,但简而言之,您需要

set -o history
set -o histexpand

在您的脚本中启用历史扩展。

于 2013-06-08T15:22:50.453 回答
1

历史扩展似乎立即被扩展,而函数体内的其他命令被推迟到函数被调用。尝试在 shell 提示符下定义函数。bash: !-$CYCLE: event not found在函数定义完成之前,我立即得到。

我尝试转义感叹号,但这会导致它在调用函数后被逐字处理,而不是作为历史扩展处理。

一种替代方法是eval和的组合fc

function cyc {
    CYCLE=3
    eval $( fc -nl -$CYCLE -$CYCLE )
}

我将放弃通常的警告,eval因为您将只是重新执行之前运行的命令,因此无论您如何完成此操作,都需要谨慎。给定的fc命令将打印历史记录中的一系列命令(-n抑制行号),并且对范围的开头和结尾使用相同的值将输出限制为单个命令。

于 2013-06-08T15:30:17.990 回答
0

单程。它提取历史记录的最后四行,考虑到history将包含在内,从中提取第一行以获得相同的结果,!-3并用于perl在执行指令之前删除历史编号和前导空格。

function cyc {
    CYCLE=4
    history | tail -"$CYCLE" | head -1 | perl -ne 's/\A\s*\d+\s*// && system( $_ )'
}
于 2013-06-08T16:16:58.647 回答