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