2017-07-30 77 views
1

我们正在尝试编写一个脚本,该脚本将基于提交历史发布文章。我们运行了下面的命令,而不是进行提交,它实际上把我们拖到了python终端;终端在尝试创建git时意外运行命令

cchilders:~/blogplish (master) 
$ git commit -m "You can run this file using the `python` command in your terminal:\n```$ python blogplish.py\nThe script is working.```" 
Python 2.7.12 (default, Jul 1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

我们很好奇它为什么这样做,上述命令中的两个蟒蛇中的哪一个导致了这个问题。另外,当我们提交这样的提交时,我们如何能够阻止这一点。我们的脚本将生成的目标语言是降价。 谢谢!

回答

6

这与Python本身无关,也没有Git,以及与你的shell(命令行解释器)有关的所有事情。

大多数Unix十岁上下壳分享一些句法特征:

  • 单引号“强引号”,保护免受几乎所有或所有扩展,并且只能由另一单引号结束。
  • 双引号是“弱引号”,对进行了一些扩展保护,但是特别允许可变值替换如$var和反引号扩展,如`command`。但请注意,双引号引用单引号,因此"he said 'hello'"保留了内部单引号。

在这种情况下,:

"... `python` ..." 

部分告诉你的shell运行python,看看它在标准输出产生。不管那个地方在那个地方将会被替代。

(这种反引用扩展很难使用。如果您它,它通常最好使用$(...)代替,因为括号帮助人们弄清楚什么是命令里面,嵌套变得很明显:利用其输出

  • 运行ls
  • reprocess $(process --files $(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 

但外壳到达该点之前必须先完成第一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

“通常使用更好......”假设有意使用扩展。 –

+1

@ Code-Apprentice:呃,是的。 :-) – torek

+1

这是迄今为止最好的答案,因为它解释了为什么OP会看到有问题的行为。唯一的小缺点是你没有明确规定解决方案。 –

4

我建议你离开-m标志并使用文本编辑器(默认为vim)来编辑你的消息。这将避免命令行将您的消息解释为命令。如果你对vim不熟悉,你可以将文本编辑器设置为更符合你的喜好的东西。

p.s.在文本编辑器中编辑邮件的另一个好处是您可以更轻松地输入多行消息。当您有团队约定来管理您的提交消息时,这是特别有利的。另外,像GitHub这样的服务在长时间的单行提交消息中表现不佳。

+1

你没事,我们可能会用nano做这个。我选择了最顶级的一个,因为它提供了最多的细节。谢谢 – codyc4321

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.```' 

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