[英]Why doesn't bash history expansion work in functions?
當我編程時,我會發現自己循環使用相同的三個shell命令,例如:
vim myGraphic.cpp
g++ -lglut -lGLU myGraphic.cpp -o prettyPicture
./prettyPicture
為了避免每次都擊中uparrow鍵三次,我將以下內容放在我的bashrc中:
function cyc {
CYCLE=3
!-$CYCLE
}
但是,當我使用'cyc'功能時,我收到錯誤
“bash:!-3:命令未找到”。
這種歷史擴展技術與shell交互工作,但它似乎不適用於函數定義。 這種差異的解釋是什么? 我怎樣才能創建一個等效於'cyc'的函數?
歷史擴展似乎立即擴展,而函數體內的其他命令將被推遲,直到調用該函數。 嘗試在shell提示符下定義函數。 我得到bash: !-$CYCLE: event not found
在函數定義完成之前bash: !-$CYCLE: event not found
立即bash: !-$CYCLE: event not found
。
我嘗試轉義感嘆號,但這會導致在調用函數后對其進行字面處理,而不是作為歷史擴展處理。
一種替代方案是eval
和fc
的組合:
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.