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

Python 终端在试图使Git提交时意外运行命令,python,git,shell,ubuntu,Python,Git,Shell,Ubuntu,我们正在尝试编写一个脚本,根据提交历史记录发布文章。我们运行了以下命令,它没有进行提交,而是将我们放入Python终端: 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 (defa

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

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

我们很好奇它为什么会这样做,上面命令中的两条蟒蛇中的哪一条导致了这个问题。还有,当我们做出这样的承诺时,如何防止这种情况发生。我们的脚本将生成的目标语言是markdown

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


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

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


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

Code Peedient提供了一个很好的选择

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

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)。

代码学徒提供了一个很好的选择

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

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)。

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

大多数Unix shell都有一些语法特性:

  • 单引号是“强引号”,可以防止几乎所有或所有的扩展,并且只以另一个单引号结束
  • 双引号是“弱引号”,可以防止某些扩展,但特别允许变量值替换,如
    $var
    和反引号扩展,如
    `command`
    。但是请注意,双引号引用单引号,因此
    “他说‘你好’”
    保留了内部单引号
在这种情况下,用户:

"... `python` ..."
部分告诉您的shell运行
python
,并查看它在其标准输出上产生了什么。无论那是什么,都会在那一刻被取代

(这种反引号扩展很难使用。如果需要,通常最好使用
$(…)
,因为括号有助于人们了解命令内部的内容,嵌套变得很明显:
重新处理$(进程--文件$(ls))
意味着:

  • 运行
    ls
  • 使用其输出作为参数,运行
    process--files
  • 使用其输出作为参数,运行
    reproprocess
如果
ls
打印
README hello.txt
,这就像运行
进程--files README hello.txt
。然后将
进程打印的任何内容拼接到
重新处理的参数中

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

`python`
``
`$ python blogplish.py\nThe script is working.`
``
其中两个是空的,因此它们不运行任何内容,也不拼接任何内容。一个运行
python
,最后一个运行
$
,这可能会产生:

$: not found
但是在shell到达该点之前,它必须首先完成第一个
python
(然后运行empty命令)

最后,正如其他人提到的,您可以不使用
-m
运行,也可以使用
-m
的强引号变量。我们还需要另外一种选择:可以使用
-F
-file=
运行提交,以从准备好的文件读取消息。您甚至可以使用
-F-
从标准输入读取消息:

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

例如。

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

大多数Unix shell都有一些语法特性:

  • 单引号是“强引号”,可以防止几乎所有或所有的扩展,并且只以另一个单引号结束
  • 双引号是“弱引号”,可以防止某些扩展,但特别允许变量值替换,如
    $var
    和反引号扩展,如
    `command`
    。但是请注意,双引号引用单引号,因此
    “他说‘你好’”
    保留了内部单引号
在这种情况下,用户:

"... `python` ..."
部分告诉您的shell运行
python
,并查看它在其标准输出上产生了什么。无论那是什么,都会在那一刻被取代

(这种反引号扩展很难使用。如果需要,通常最好使用
$(…)
,因为括号有助于人们了解命令内部的内容,嵌套变得很明显:
重新处理$(进程--文件$(ls))
意味着:

  • 运行
    ls
  • 使用其输出作为参数,运行
    process--files
  • 使用其输出作为参数,运行
    reproprocess
如果
ls
打印
README hello.txt
,这就像运行
进程--files README