【问题标题】:Wrapping git in other commands via bash function通过 bash 函数将 git 包装在其他命令中
【发布时间】:2015-01-26 02:27:06
【问题描述】:

所以我想在调用 git 之前和之后运行一段 AppleScript(不是下面的 AppleScript,不同的 AppleScript,但这应该能说明问题)。我遇到的问题是 git 命令有可变数量的参数,所以我不能只使用 $1 给它第一个,它必须是传入的数字。这是我的代码在我的.bash_profile:

function git() {
    osascript -e 'display alert "before git command"';
    git "$@";
    osascript -e 'display alert "after git command"';
}

预期的结果是第一段 applescript 运行,git 使用提供的任何数量的参数运行,然后运行最后一段 applescript。真正发生的是第一段 AppleScript 无限期地反复运行。我认为问题可能是 git 之后的"$@"From what I understand 使用 "$@" 将转储所有参数。但是第一段 applescript 只是在无限循环中运行。什么给了?

【问题讨论】:

  • 上面的代码 sn-p 会发生这种情况吗?
  • @RespectMyAuthoritah 是的

标签: git bash shell applescript


【解决方案1】:

你破坏了git 的名字。你的函数是git,你在函数中调用git。恭喜,你有递归了。

你需要告诉 shell 调用中间的 real git 二进制文件。

使用command git/full/path/to/git等。

还有\git(但我认为这只是避免了别名而不是函数)。

另外,正如@ryenus 在评论中指出的那样。 env 二进制文件 /usr/bin/env/bin/env 也可用于此目的(尽管它不仅仅避免了该功能,还需要生成额外的外部进程)。

【讨论】:

  • @ryenus 也是一个选择,但我不会说“更好”。 env 是具有不同目的的外部二进制文件(恰好与此目的重叠)。但这正是 command(内置 shell)的用途。
  • @BrianTkatch 阅读command 的bash 手册页定义和env 的手册页。他们做不同的(但在这种情况下是重叠的)事情。关于外部与内置的问题只是时间问题。内置将比外部工具执行得更好,因为它不需要产生第二个/第三个/等。过程。这在简单的情况下无关紧要,但它会循环/等。并且对于大数据,它可能是巨大的。
  • @EtanReisner,同意,在这种情况下,命令稍微好一些,尤其是涉及env 所涉及的额外过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
  • 2020-12-11
相关资源
最近更新 更多