终端在尝试进行git提交时意外运行命令

时间:2017-07-30 03:32:06

标签: python git shell ubuntu

我们正在尝试编写一个基于提交历史记录发布文章的脚本。我们运行了以下命令,而不是进行提交,它实际上将我们放入了python终端;

list = [1,2,3,4,5,6,7]

我们很好奇为什么会这样做,上面命令中的两个蟒蛇中的哪一个引起了这个问题。另外,当我们提交这样的提交时,我们如何防止这种情况。我们的脚本将生成的目标语言是markdown。 谢谢!

3 个答案:

答案 0 :(得分:6)

这与Python本身,Git以及与shell(命令行解释器)有关的一切都无关。

大多数Unix-ish shell都有一些语法特征:

  • 单引号是"强引号",可以抵御几乎所有或所有扩展,并且仅以另一个单引号结束。
  • 双引号是"弱引号",防止某些扩展,但特别允许$var等变量值替换和`command`等反引号扩展。但请注意,双引号引用单引号,因此"he said 'hello'"会保留内部单引号。

在这种情况下,:

"... `python` ..."

部分告诉你的shell运行python并看看它在标准输出上产生了什么。无论那是什么,都会在那时替代。

(这种反引用扩展很难使用。如果你想要它,通常最好使用$(...),因为括号可以帮助人类找出什么在命令中,嵌套变得明显:reprocess $(process --files $(ls))表示:

  • 运行ls
  • 使用其输出作为参数,运行process --files
  • 使用其输出作为参数,运行reprocess

如果ls打印README hello.txt,则就像运行process --files README hello.txt一样。然后将process打印件拼接到reprocess的参数中。)

要完成此处的项目,首先所有反引号表达式将按顺序运行和拼接。有四对反引号:

`python`
``
`$ python blogplish.py\nThe script is working.`
``

其中两个是空的,所以它们什么都不运行,什么也没有拼接。一个运行python,最后一个运行$,这可能会产生:

$: not found

但是在shell到达那一点之前,它必须先完成第一个python(然后运行空命令)。

最后,正如其他人所提到的,您可以在没有-m的情况下运行,或者使用-m更强的引号变体。还有一个替代方案,我们需要the git commit documentation:可以使用-F <file>--file=<file>运行提交以从准备好的文件中读取消息。您甚至可以使用-F -从标准输入中读取消息:

printf '%s\n\n%s\n' 'commit subject' 'commit message body' | git commit -F -
例如

答案 1 :(得分:4)

我建议您不要使用-m标记并使用文本编辑器(默认情况下为vim)来编辑邮件。这将避免命令行将您的消息解释为命令。如果您不熟悉vim,可以根据自己的喜好设置文本编辑器。

P.S。在文本编辑器中编辑消息的另一个好处是,您可以更轻松地输入多行消息。当您拥有管理提交消息的团队约定时,这尤其有用。此外,像GitHub这样的服务在长单线提交消息方面表现不佳。

答案 2 :(得分:4)

Code-Apprentice提供了一个很好的选择。

如果您确实想在命令行上提供提交消息,则应该能够使用单引号而不是双引号:

git commit -m 'You can run this file using the `python` command in your terminal:\n```$ python blogplish.py\nThe script is working.```'

Bash(Ubuntu系统上的默认shell)doesn't process backticks in single-quoted strings