Bash/Shell通過配置文件.bashrc劫持命令行,實現(xiàn)輸入數(shù)字前綴即可重復多次執(zhí)行某條命令,替代手敲for循環(huán)

要實現(xiàn)的效果

輸入數(shù)字N + 空格 + 任意命令行:重復執(zhí)行該條命令N次:

da531c4451488ad672f1e682ba45e8cd_176373-20230223154810798-1610109854.png

常規(guī)做法:

for i in {1..5};do pwd;done   #此種做法命令略顯冗長,特別命令和參數(shù)較長的話不方便光標移動和高效操作
96a584d7f24f8e1d146ad8fe7fe46537_176373-20230223155832832-529472516.png

改造方式:

通過Bash Shell配置文件(.bashrc)文件動態(tài)判斷輸入的命令行是否是以一個純數(shù)字打頭,如果是,執(zhí)行我們預定義的操作來實現(xiàn)目的;

先決條件:

安裝Bash Shell第三方開源拓展工具庫bash-preexec:( https://github.com/rcaloras/bash-preexec
此庫封裝了兩個回調(diào)函數(shù)preexecprecmd,分別對應命令執(zhí)行前和命令執(zhí)行后要執(zhí)行的hook操作;
利用此庫提供的這倆回調(diào)函數(shù)功能,可以實現(xiàn)更多騷操作(例如:動態(tài)更改Prompt提示符,計算命令的執(zhí)行時間、終端輸入算術表達式直接計算結(jié)果等等),此處不再贅述,具體用法參看官方Github文檔說明;

Hook代碼實現(xiàn):

1、在preexec回調(diào)函數(shù)中加入以下代碼塊:

preexec() {
        exec 7>&1 8>&2
    export COMMAND_EXEC_BEGINNING=$(date +'%s')   #開始執(zhí)行命令時記錄時間戳
    #echo "$BASH_COMMAND"  #<---當前執(zhí)行的完整命令行
    local _prefixCommand=$(awk '{print $1;exit}' <<<"$BASH_COMMAND")
    local _commandPartCount=$(awk '{print NF;exit}' <<<"$BASH_COMMAND")
    [ $_commandPartCount -gt 1 ] && [ ! -z "$_prefixCommand" ] && ! type -t "$_prefixCommand" &>/dev/null && expr "$_prefixCommand" + 0 &>/dev/null && {
        #(注意執(zhí)行命令時如果需要保存輸出,需要使用追加重定向符號,覆蓋重定向符號不起作用,疑似被覆蓋?)
        #eg:5 date>>datelog.log【有效】
        #    5 date>datelog.log 【無效】
        #echo "執(zhí)行多次命令..."
        local _rCount="$_prefixCommand"
        local _command=$(awk '{sub($1" ","");print;}' <<<"$BASH_COMMAND")
        for _i in `seq 1 $_rCount`
        do
            #echo "執(zhí)行第 $_i 次:$_command"
            eval "$_command"
        done
        #unset PROMPT_COMMAND
        #unset BASH_COMMAND
        #_no_error() {
        #   eval ""
        #}
        #trap _no_error 0
        #exec 1>/dev/null 2>&1
        exec 2>/dev/null   #<---屏蔽掉數(shù)字開頭的命令的錯誤輸出
        return
        }
}

2、在precmd回調(diào)函數(shù)中加入以下代碼塊:

precmd() { 
 #exec 1>/dev/tty 2>&1
 [ -t 7 ] && exec 1>&7 7>&-   #恢復標準輸出
 [ -t 8 ] && exec 2>&8 8>&-   #恢復錯誤輸出
 [ -n "$COMP_LINE" ] && return  # do nothing if completing
 [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
 local this_command=`HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//"`;
 #echo "printing the prompt $this_command"; 
 #echo $this_command
}

使用效果:

image
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容