例如,假设我有一个命令git branch
(总是带有几个单词)。
我想要的是跟踪何时使用参数执行此命令。例如,如果我执行命令git branch develop
没有错误,我想保存develop
在文件中。
我尝试覆盖我的 git 命令.bash_profile
,如下所示:
git () {
if [ $# -eq 3 ]
then
git $@
echo $2 > /path/tacked_parameters.txt
else
git $@
fi
}
但似乎效果不太好。有什么办法可以做到这一点吗?
答案1
你在这里遇到了一些问题:
- 您的
git
函数正在递归地调用自身而不是原始git
命令。 - 你使用的是
$@
不带引号的,这没有任何意义 - 你是保留其他变量不带引号,要求 shell 将它们分割+通配。
- 你是用于
echo
任意数据。 - 您将丢失原始命令的退出状态
git
。 - 每次调用时您都会覆盖日志文件。
- 您将函数定义放入您的函数定义中
~/.bash_profile
,这意味着自定义您的登录会话,而不是您的 shell,并且通常不会被非登录bash
调用读取。
你想要这样的东西:
git() {
if [ "$#" -eq 3 ]
then
local ret
command git "$@"; ret=$?
printf '%s\n' "$2" >> /path/tacked_parameters.txt
return "$ret"
else
command git "$@"
fi
}
那是:
- 引用你的变量,
- 用于
command
运行git
命令, - 将退出状态保存
git
在局部变量中并在退出时返回它, - 使用
>>
而不是>
重定向到日志文件。 - 使用
printf
而不是echo
. - 并将其放入您的
~/.bashrc
(确保您的~/.bash_profile
采购是~/.bashrc
因为登录bash
外壳默认情况下不读取~/.bashrc
(bash
错误/错误功能))。除非您想导出该git
函数(使用export -f git
),以防万一您还需要调用调用该函数bash
的脚本。git