簡體   English   中英

為什么不在功能中抨擊歷史擴展工作?

[英]Why doesn't bash history expansion work in functions?

當我編程時,我會發現自己循環使用相同的三個shell命令,例如:

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

為了避免每次都擊中uparrow鍵三次,我將以下內容放在我的bashrc中:

function cyc { 
    CYCLE=3
    !-$CYCLE 
}

但是,當我使用'cyc'功能時,我收到錯誤

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

這種歷史擴展技術與shell交互工作,但它似乎不適用於函數定義。 這種差異的解釋是什么? 我怎樣才能創建一個等效於'cyc'的函數?

這里有人提出這個問題: 使用“!” 在腳本中執行具有相同參數的命令,但簡而言之,您需要執行此操作

set -o history
set -o histexpand

在您的腳本中啟用歷史記錄擴展。

歷史擴展似乎立即擴展,而函數體內的其他命令將被推遲,直到調用該函數。 嘗試在shell提示符下定義函數。 我得到bash: !-$CYCLE: event not found在函數定義完成之前bash: !-$CYCLE: event not found立即bash: !-$CYCLE: event not found

我嘗試轉義感嘆號,但這會導致在調用函數后對其進行字面處理,而不是作為歷史擴展處理。

一種替代方案是evalfc的組合:

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

我會放棄關於eval的常規警告,因為你只是重新執行你之前運行的命令,所以不管你做到了這一點都會謹慎。 給定的fc命令將從歷史記錄中打印一系列命令( -n禁止行號),並且使用相同的值開始和結束范圍將輸出限制為單個命令。

單程。 它提取了歷史記錄的最后四行,考慮到將包含history ,從中提取第一個相同結果的文件!-3並在執行指令之前使用perl刪除歷史編號和前導空格。

function cyc {
    CYCLE=4
    history | tail -"$CYCLE" | head -1 | perl -ne 's/\A\s*\d+\s*// && system( $_ )'
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM