在某些命令上跟踪某些参数


10

假设我有一个命令git branch(总是有几个单词)。

我要跟踪的是何时使用参数执行此命令。例如,如果我执行命令时git branch develop没有错误,我想保存develop在文件中。

我试图覆盖我的git命令.bash_profile,如下所示:

git () {
    if [ $# -eq 3 ]
    then
        git $@
        echo $2 > /path/tacked_parameters.txt
    else
        git $@
    fi
}

但是似乎效果不佳。有什么办法吗?


根据您的示例(git分支开发),您要检查“ $#”是否为“ 2”而不是“ 3”?...(git函数有2个参数)
Olivier Dulac

是个错误,但是代码只是一个例子
jherran

好。我在斯蒂芬(好的)答案下方添加了其他备注。我的言论可能不适用(我认为.txt是一个日志文件,但是可能其中没有日期吗?)
Olivier Dulac

Answers:


18

您在这里遇到一些问题:

  • 您的git函数正在递归调用自身而不是原始git命令。
  • 您正在使用$@未引用的单引号
  • 将其他变量保留为未引号,要求外壳将它们拆分+使其遍历。
  • 您正在使用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来调用该函数。

1
令人惊讶的解释,像魅力一样。非常感谢你。
jherran

+1是一个很好的答案。但操作员可能需要[ "$#" -eq 2 ]根据他的示例将支票更改为。最好将日期也添加到“ tacked_pa​​rameters.txt”中。我会去一般情况下(即,不只是跟踪第二参数的时候2个参数,但跟踪任何参数):我想摆脱如果和有:printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*"?(即,显示命令+所有参数(注意,您仍然会丢失一些信息,例如,哪个参数具有内部分隔符,如果有的话。)接近 iso8601标准的可移植日期)
Olivier Dulac
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.