2

コマンドを入力すると、使用した回数をカウントするなどのプログラムを作成できるようになりたいですcd。これに似たもの:

[ : ~ $] cd public_html
Congratulations! You've earned the Badge 'cd master!'. Level up!

これまでに構成されたすべてのC++ファイルは次のとおりです。

#include <iostream>

int main(int argc, char* argv[]) {
    int counter = 0;
    for (int i = 1; i < argc; i++) {
        std::cout << argv[i] << std::endl;
        if (argv[i] == "cd")
            std::cout << "Badge earned 'cd master!' +5120 experience points" << std::endl;
    }
    return 0;
}

以下を含む 1 つの試みられた解決策を反映しているため。

#!/bin/sh
bash | tee ./main

bind 'RETURN: "echo $(!!) | tee ~/.main \n"'

一緒に行くことにしました

export PROMPT_COMMAND='history | tail -n1'

しかし、それは出力を解析しなければならないことを意味します。

これを達成する最も簡単な方法は何ですか?

編集

これが私がなんとか生産したものです:

#!/bin/sh
export COUNTER=0
export MAXWIDTH=10
export TNL=1000
update_prompt() {
  export PS1="> "
}
cd() {
  COUNTER=$(($COUNTER + 25));
  echo +25;
  builtin cd $@;
}
help() {
  echo "custom commands are: score";
}
score() {
  echo $COUNTER"/"$TNL
  BAR=$(yes "#" | head -n 10 | tr -d '\n')
  OVERLAY=$(yes "%" | head -n 10 | tr -d '\n')
  WIDTH=$(echo "$COUNTER*$MAXWIDTH/$TNL" | bc)
  FIRST=${BAR:0:WIDTH}
  SECOND=${OVERLAY:0:$((MAXWIDTH-WIDTH))}
  echo "["$FIRST$SECOND"]"
}
exit() {
    echo "Bye bye";
    builtin exit $@;
}
export -f update_prompt
export -f cd # export the function
export -f help
export -f score
export -f exit

bash # run subshell with the exported functions
update_prompt
4

3 に答える 3

0

私は少し前に似たようなことをしましたが、これが私が見つけた解決策です。

次の行を に追加します.bashrc

hook() {
    whatever "$@"
}

invoke_hook() {
    [ -n "$COMP_LINE" ] && return
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return
    local command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
    hook "$command"
}

trap 'invoke_hook' DEBUG

whateverC++ プログラムに置き換えます。これにより、各コマンドの前にフックが実行され、元のコマンドが引数として渡されます。

于 2013-10-16T12:40:28.483 に答える