2017-07-30 89 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