终端在尝试使 Git 提交时意外运行命令



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

cchilders:~/blogplish (master) 
$ git commit -m "You can run this file using the `python` command in your terminal:n```$ python blogplish.pynThe 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.
>>> 

我们很好奇它为什么这样做,上面命令中的两个 Python 中的哪一个导致了这个问题。另外,当我们进行这样的提交时,我们如何防止这种情况。我们的脚本将生成的目标语言是 markdown。

这与 Python 本身无关,也与 Git 无关,而与你的 shell(命令行解释器(有关。

大多数 Unix 风格的 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.pynThe script is working.`
``

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

$: not found

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

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

printf '%snn%sn' 'commit subject' 'commit message body' | git commit -F -

例如。

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

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

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

Bash(Ubuntu系统上的默认shell(不处理单引号字符串中的反引号。

我建议您省略-m标志并使用文本编辑器(默认情况下为 vim(来编辑您的消息。这将避免命令行将消息解释为命令。如果您不熟悉 vim,可以将文本编辑器设置为更符合您喜好的内容。

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

最新更新