跟踪某些命令的某些参数

jhe*_*ran 10 shell bash function

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

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

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

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

但似乎效果不佳。有没有办法做到这一点?

Sté*_*las 18

您在这里遇到了一些问题:

  • 您的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
}
Run Code Online (Sandbox Code Playgroud)

那是:

  • 引用你的变量,
  • 用于command运行git 命令
  • 将退出状态保存git在局部变量中并在退出时返回,
  • 使用>>而不是>重定向到日志文件。
  • 使用printf代替echo.
  • 并将其放入您的~/.bashrc(确保您~/.bash_profile正在采购,~/.bashrc因为默认情况下bash不会读取登录外壳~/.bashrcbash错误/错误功能))。除非您想导出该git函数(使用export -f git),以防万一您还需要调用该函数的bash脚本git