0

プログラミングをしていると、同じ 3 つのシェル コマンドを繰り返し使用していることに気付くでしょう。たとえば、次のようになります。

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

毎回上矢印キーを 3 回押すのを避けるために、bashrc に次のように記述します。

function cyc { 
    CYCLE=3
    !-$CYCLE 
}

ただし、「cyc」関数を使用すると、エラーが発生します

「bash: !-3: コマンドが見つかりません」。

このヒストリー展開の手法は、シェルと対話的に機能しますが、関数定義では機能しないようです。この違いの説明は何ですか?「cyc」と同等の関数を機能させるにはどうすればよいですか?

4

3 に答える 3

1

履歴展開はすぐに展開されるように見えますが、関数の本体内の他のコマンドは、関数が呼び出されるまで延期されます。シェル プロンプトで関数を定義してみてください。bash: !-$CYCLE: event not found関数定義が完了する前に、すぐに取得します。

感嘆符をエスケープしようとしましたが、これにより、関数が呼び出されると、履歴展開として処理されるのではなく、文字どおりに扱われます。

eval1 つの代替手段は、との組み合わせですfc

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

eval以前に実行したコマンドを単に再実行するだけなので、通常の警告は省略します。そのため、これをどのように実行しても注意が必要です。指定されfcたコマンドは、履歴から一連のコマンドを出力し (-n行番号を抑制します)、範囲の最初と最後に同じ値を使用すると、出力が単一のコマンドに制限されます。

于 2013-06-08T15:30:17.990 に答える
0

一方通行。含まれることを考慮して、履歴の最後の 4 行を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 に答える