Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于bash RPG的审计bash命令_C++_Bash - Fatal编程技术网

C++ 用于bash RPG的审计bash命令

C++ 用于bash RPG的审计bash命令,c++,bash,C++,Bash,我希望能够编写一个程序,当你输入命令时,它会做一些事情,比如计算你使用cd的次数。类似于此: [ : ~ $] cd public_html Congratulations! You've earned the Badge 'cd master!'. Level up! P>我所有的C++文件都是: #include <iostream> int main(int argc, char* argv[]) { int counter = 0; for (int i

我希望能够编写一个程序,当你输入命令时,它会做一些事情,比如计算你使用
cd
的次数。类似于此:

[ : ~ $] cd public_html
Congratulations! You've earned the Badge 'cd master!'. Level up!
<> P>我所有的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;
}

我决定和你一起去

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

在bash中执行每个命令
command\u提示符
后。您可以将其与
历史记录一起使用,以查看最后使用的命令

您可以阅读PS1、PS2、PS3和命令提示符在bash中的工作原理

这个问题已经有了一些答案,所以:


一个简单的解决方案是在shell本身内部覆盖shell的
cd
命令。例如,在Bash或ZSH中:

cd() {
  echo "Congratulations";
  builtin cd $@;
}
(例如,这在以下项目中使用。)

您可以对所有其他命令执行相同的操作。你也可以从那里调用C++代码。 如果您想将其放入脚本中,例如,将其命名为
learn bash.sh

cd() { ... }
export -f cd # export the function

bash # run subshell with the exported functions


另一个解决方案,您有更多的功能,但更复杂的方式是:获取Bash的源代码(它是C)并扩展它(通过C或C++)。然后你基本上可以做任何你想做的事。所有的东西都直接放在那里,比如解析的命令等等。

我刚才也做过类似的事情,下面是我找到的解决方案

要将以下行添加到
.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

< >用C++程序替换<代码> < < /代码>。这将在每个命令之前执行钩子,并将原始命令作为参数传递

如果有人说:
while:,你会给他颁发什么徽章;做cd$回家;完成
?@devnull这是供个人使用的。我不使用外壳,除非我需要。这是一个非常可爱的想法,我很想看到结果:)你的问题是?你也可以看到是的,我已经看过了这些链接。我使用了
PROMPT\u命令
,因为它有最干净的输出。@RedX:是的,但他不一定要这样做,因为他可能希望对不同的命令有不同的行为?另外,它还避免了在他的外部程序中手动解析命令的问题。@Albert:我想我可以只编写一个一次性脚本,这样就不必手动键入了。但是,我应该把它放在哪里?无论你把它放在哪里,你都可以通过
source myscript.sh
导入它。或者您可以导出它并生成子shell。我将扩展我的问题。
cd() { ... }
export -f cd # export the function

bash # run subshell with the exported functions
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