2
#!/bin/sh
LOG='log --pretty=format:"%h - %an, %ar : %s"'

git $LOG

我希望这会以指定的格式输出一个实际的 git 日志。但是,我得到的只是一个致命的参数错误。

我也尝试了以下选项,但它们也不起作用:

LOG="log --pretty=format:\"%h - %an, %ar : %s\""
LOG='log --pretty=format:\"%h - %an, %ar : %s\"'

然而,奇怪的是下面的脚本确实有效,我不明白为什么:

LOG='--pretty=format:"%h - %an, %ar : %s"'
git log "$LOG"

有人争辩说,shell 认为变量只是一个参数,但是以下工作正常:

LOG1LINE='log --pretty=oneline'
git $LOG1LINE
4

2 回答 2

4

这是克服这个问题的一种方法。使用 bash 数组:

#!/bin/bash
#It's important to use bash instead of sh for this to work

LOG=(log --pretty=format:"%h - %an, %ar : %s")
git "${LOG[@]}"
于 2013-07-23T15:53:04.503 回答
2

这是 shell 如何处理参数的产物。

shell 做的第一件事是替换变量。变量定义中使用的引号不会在此处保留。然后它根据引号将它们分块成参数,或者如果这些不存在,则基于单词边界。首次使用时引用的引号在当时被转义,因此无法定义单词边界。

git因此,在您的第一个示例中传递给的参数是:

  • log
  • --pretty=format:"%h
  • -
  • %an,
  • %ar
  • :
  • %s"

在后面的示例中,传递给的参数git是:

  • log
  • --pretty=format:"%h - %an, %ar : %s"
于 2013-07-23T15:21:26.220 回答