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

2024-10-04 11:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我们正在尝试编写一个脚本,根据提交历史记录发布文章。我们运行了以下命令,它没有提交,而是将我们放入了一个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.
>>> 

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


Tags: rungit命令master脚本you终端历史记录
3条回答

代码学徒提供了一个很好的选择。你知道吗

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

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。你知道吗

我建议您不要使用-m标志,而是使用文本编辑器(默认情况下是vim)来编辑您的消息。这将避免命令行将消息解释为命令。如果您不熟悉vim,可以将文本编辑器设置为更适合您的内容。你知道吗

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

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

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

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

在这种情况下:

"... `python` ..."

part让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(然后运行empty命令)。你知道吗

最后,正如其他人提到的,您可以不使用-m运行,或者使用带有-m的强引号变体。还有另一种选择,我们需要the ^{} documentation:可以使用-F <file> file=<file>运行提交来从准备好的文件读取消息。您甚至可以使用-F -从标准输入读取消息:

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

例如。你知道吗

相关问题 更多 >